函数在迭代内多次运行

时间:2014-11-24 11:34:00

标签: 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];
    }
}

0 个答案:

没有答案