C 函数在中多次运行以进行迭代
我有一个C程序的问题,我目前正在为一个学校项目开发。 问题是,我必须做一个SDNV(自定界数值)模拟器。在我决定实现一个删除数组左侧字节0(0x00)的函数之前,程序一直运行良好 当我这样做的时候,我的程序开始显示一些不稳定的行为。在我的代码中的某个点上,我打印了原始数组中的位,这些位尚未转换为SDNV格式,这就是问题所在,除了迭代运行正确的次数外,其中的函数运行更多次,并且具有随机值,我用printf测试了它,以确认for的运行次数正确 我试着做了很多事情来解决这个问题,但没能,所以,如果有人知道发生了什么,如果你能帮我解决这个问题,我将非常感激 其他信息:C 函数在中多次运行以进行迭代,c,for-loop,C,For Loop,我有一个C程序的问题,我目前正在为一个学校项目开发。 问题是,我必须做一个SDNV(自定界数值)模拟器。在我决定实现一个删除数组左侧字节0(0x00)的函数之前,程序一直运行良好 当我这样做的时候,我的程序开始显示一些不稳定的行为。在我的代码中的某个点上,我打印了原始数组中的位,这些位尚未转换为SDNV格式,这就是问题所在,除了迭代运行正确的次数外,其中的函数运行更多次,并且具有随机值,我用printf测试了它,以确认for的运行次数正确 我试着做了很多事情来解决这个问题,但没能,所以,如果有人
只有当我实际调用函数删除0时,问题才会出现
即使在打印位后调用函数,也会出现此问题
只有当要打印的数字大于0x7f时,才会出现此问题 这是完整的代码,我对代码中的葡萄牙语感到抱歉,但我的老师要求我们这样做,以便他能更好地理解它 更新的代码,我试图制作一个最小的代码将其放在这里,问题出现在添加
converte
函数时
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#define TAMANHOVETOR 2
typedef unsigned char byte;
void removeZerosAEsquerda(byte *vetor, int *tamanho);
void _printBits(byte num);
void converte(byte *vetorOriginal, byte *vetorConvertido, int tamanhoVetor);
void inverteVetor(byte *vetor, int tamanhoVetor);
void main(){
byte vetor[100]={0x00, 0x9f};
byte vetorC[100];
int i, sizeVetor=TAMANHOVETOR;
for(i=0;i<sizeVetor;i++){
printf("%x ", vetor[i]);
}
for(i=0;i<sizeVetor;i++){
printf("\nDentro do for, imprimindo em bits valor %x", vetor[i]);
_printBits(vetor[i]);
}
removeZerosAEsquerda(vetor, &sizeVetor);
converte(vetor, vetorC, sizeVetor);
}
void removeZerosAEsquerda(byte *vetor, int *tamanho){
byte vetorAux[100];
int index = 0, indexAux=0, novoTamanho=0;
while(vetor[index]==0x00){
index++;
}
for(;index<*tamanho;index++){
vetorAux[indexAux]=vetor[index];
novoTamanho++;
}
for(index=0;index<novoTamanho;index++){
vetor[index]=vetorAux[index];
}
*tamanho=novoTamanho;
}
void _printBits(byte num){
int index=0;
byte bit;
printf("\n_printBits num=%u\n", num);
for(index=7;index>=0;--index){
bit=(num & (1 << index));
printf("\nBIT: %u\tIndex: %d\t", bit>>index, index);
bzero(&bit,1);
}
}
void converte(byte *vetorOriginal, byte *vetorConvertido, int tamanhoVetor){
int indexVetorOriginal=tamanhoVetor-1, indexVetorConvertido=0, indexBitsOriginal=0,indexBitsConvertido=0, controle=0;
byte bit;
while(indexVetorOriginal>=0){
if(indexBitsConvertido==7){
//ultimo bit de cada serie, setar pra 0 se for a primeira execução, caso contrário setar pra 1
if(indexVetorConvertido==0){
//primeiro bit sendo convertido, setar pra 0
vetorConvertido[indexVetorConvertido] &= ~(1 << indexBitsConvertido);
}
else{
//outros bits, setar pra 1
vetorConvertido[indexVetorConvertido] |= 1 << indexBitsConvertido;
}
bit=(vetorOriginal[indexVetorOriginal] & (1 << indexBitsOriginal));
if(((bit>>indexBitsOriginal)==0)&&indexVetorOriginal==0){
//verificação para garantir que no ultimo byte, caso o ultimo bit seja 0 ele seja desconsiderado
indexBitsOriginal=(indexBitsOriginal+1)%8;
controle=1;
}
}
else{
//Default Case
bit=(vetorOriginal[indexVetorOriginal] & (1 << indexBitsOriginal));
if((bit>>indexBitsOriginal)==1){
//setando bit pra 1
vetorConvertido[indexVetorConvertido] |= 1 << indexBitsConvertido;
}else{
//setando bit pra 0
vetorConvertido[indexVetorConvertido] &= ~(1 << indexBitsConvertido);
}
indexBitsOriginal=(indexBitsOriginal+1)%8;
}
indexBitsConvertido=(indexBitsConvertido+1)%8;
if(indexBitsConvertido==0){
indexVetorConvertido++;
}
if(indexBitsOriginal==0){
indexVetorOriginal--;
}
bzero(&bit, 1);
}
if(controle==0)
{
while(indexBitsConvertido<7)
{
//é necessario setar os bits até a posicao 6 pra 0, e á 7 pra 1
vetorConvertido[indexVetorConvertido] &= ~(1 << indexBitsConvertido);
_printBits(vetorConvertido[indexVetorConvertido]);
indexBitsConvertido++;
}
vetorConvertido[indexVetorConvertido] |= 1 << 7;
indexVetorConvertido++;
}
//depois de convertido, o vetor deve ser invertido
inverteVetor(vetorConvertido,indexVetorConvertido);
}
void inverteVetor(byte *vetor, int tamanhoVetor)
{
int index, indexAux=0;
byte vetorAux[100];
for(index=tamanhoVetor-1;index>=0;index--){
vetorAux[indexAux]=vetor[index];
indexAux++;
}
for(index=0;index<tamanhoVetor;index++){
vetor[index]=vetorAux[index];
}
}
#包括
#包括
#包括
#定义TAMANHOVETOR 2
typedef无符号字符字节;
void removeZerosaQuerda(字节*vetor,int*tamanho);
void_打印位(字节数);
无效转换(字节*vetorOriginal,字节*vetorConvertido,int-tamanhoVetor);
无效逆变器(字节*逆变器,int tamanhoVetor);
void main(){
字节vetor[100]={0x00,0x9f};
字节vetorC[100];
int i,sizeVetor=塔曼霍夫特;
对于(i=0;iTR;DR.请缩小您的问题范围。请提供一个刚做过的,抱歉我之前没有做过,不知道必须做。这是显示问题的代码的最低版本,非常感谢提示,它确实很容易清理,现在我知道问题只在添加和调用函数converte时出现
到code你的converte函数调用_printBits。与for循环无关-计算机也在做你告诉它的事情。完全独立,但你的代码没有按照规定编译-你需要使用int main(),而不是void main()事实上,它修复了…如此愚蠢的事情…我甚至为它感到尴尬,但有时你花了太多时间查看代码,以至于必须由另一个人来指向你。非常感谢你的帮助!在我看到错误之前,你可能为我省下了很多麻烦。void main
的东西只是复制时的一个错误在这里粘贴代码时,在原始代码中定义为int。