我正在为我正在为学校项目开发的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];
}
}