如何使用开关或特定位置的if-else步骤将十六进制值分配给数组?
我正在开发一个业余爱好项目,它需要我根据某些十六进制函数调用将十六进制值分配给一个数组。然而,该数组不会被返回,并简单地冻结执行程序。寻找一些见解。如何使用开关或特定位置的if-else步骤将十六进制值分配给数组?
我需要然后采取返回的无符号字符数组,然后将其移动到第二个数组没有NULL值。这我将用在我的主程序中。
谢谢, 奥勒
//Function to get hex condition
unsigned char set_lpx_var(char S0,char S1,char S2,char S3)
{
unsigned char PIN;
if((S0==0)&&(S1==0)&&(S2==0)&&(S3==0)) PIN = 0x00;
else if((S0==1)&&(S1==0)&&(S2==0)&&(S3==0)) PIN = 0x01;
else if((S0==0)&&(S1==1)&&(S2==0)&&(S3==0)) PIN = 0x02;
else if((S0==1)&&(S1==1)&&(S2==0)&&(S3==0)) PIN = 0x03;
else if((S0==0)&&(S1==0)&&(S2==1)&&(S3==0)) PIN = 0x04;
else if((S0==1)&&(S1==0)&&(S2==1)&&(S3==0)) PIN = 0x05;
else if((S0==0)&&(S1==1)&&(S2==1)&&(S3==0)) PIN = 0x06;
else if((S0==1)&&(S1==1)&&(S2==1)&&(S3==0)) PIN = 0x07;
else if((S0==0)&&(S1==0)&&(S2==0)&&(S3==1)) PIN = 0x08;
else if((S0==1)&&(S1==0)&&(S2==0)&&(S3==1)) PIN = 0x09;
else if((S0==0)&&(S1==1)&&(S2==0)&&(S3==1)) PIN = 0x0A;
else if((S0==1)&&(S1==1)&&(S2==0)&&(S3==1)) PIN = 0x0B;
else if((S0==0)&&(S1==0)&&(S2==1)&&(S3==1)) PIN = 0x0C;
else if((S0==1)&&(S1==0)&&(S2==1)&&(S3==1)) PIN = 0x0D;
else if((S0==0)&&(S1==1)&&(S2==1)&&(S3==1)) PIN = 0x0E;
else if((S0==1)&&(S1==1)&&(S2==1)&&(S3==1)) PIN = 0x0F;
else PIN = 0x00;
printf("\n Obtained hexa digit %u",(unsigned)PIN);
return PIN;
}
功能分配的十六进制值来阵列
unsigned char* command(unsigned char PIN,int sw,int size)
{
unsigned char* x;
x = (unsigned char*)malloc(size);
//select line assignment to array
if(sw == 1)
{
if(PIN==0x00)
{
x[0]='0';
x[1]='0';
x[2]='0';
}
else if(PIN==0X01)
{
x[0]='1';
x[1]='0';
x[2]='0';
}
else if(PIN==0x02)
{
x[0]='0';
x[1]='1';
x[2]='0';
}
else if(PIN==0x03)
{
x[0]='1';
x[1]='1';
x[2]='0';
}
else if(PIN==0x04)
{
x[0]='0';
x[1]='0';
x[2]='1';
}
else if(PIN==0x05)
{
x[0]='1';
x[1]='0';
x[2]='1';
}
else if(PIN==0x06)
{
x[0]='0';
x[1]='1';
x[2]='1';
}
else if(PIN==0x07)
{
x[0]='1';
x[1]='1';
x[2]='1';
}
else
{
printf("\n Invalid hexa digit %u",(unsigned)PIN);
}
//selection command
return x;
}
else if(sw == 2)
{
if(PIN==0x00)
{
x[3]='0';
x[4]='0';
x[5]='0';
}
else if(PIN==0X01)
{
x[3]='1';
x[4]='0';
x[5]='0';
}
else if(PIN==0x02)
{
x[3]='0';
x[4]='1';
x[5]='0';
}
else if(PIN==0x03)
{
x[3]='1';
x[4]='1';
x[5]='0';
}
else if(PIN==0x04)
{
x[3]='0';
x[4]='0';
x[5]='1';
}
else if(PIN==0x05)
{
x[3]='1';
x[4]='0';
x[5]='1';
}
else if(PIN==0x06)
{
x[3]='0';
x[4]='1';
x[5]='1';
}
else if(PIN==0x07)
{
x[3]='1';
x[4]='1';
x[5]='1';
}
else
{
printf("\n Invalid hexa digit %u",(unsigned)PIN);
}
//selection command
return x;
}
else if(sw == 3)
{
if(PIN==0x00)
{
x[6]='0';
x[7]='0';
x[8]='0';
}
else if(PIN==0X01)
{
x[6]='1';
x[7]='0';
x[8]='0';
}
else if(PIN==0x02)
{
x[6]='0';
x[7]='1';
x[8]='0';
}
else if(PIN==0x03)
{
x[6]='1';
x[7]='1';
x[8]='0';
}
else if(PIN==0x04)
{
x[6]='0';
x[7]='0';
x[8]='1';
}
else if(PIN==0x05)
{
x[6]='1';
x[7]='0';
x[8]='1';
}
else if(PIN==0x06)
{
x[6]='0';
x[7]='1';
x[8]='1';
}
else if(PIN==0x07)
{
x[6]='1';
x[7]='1';
x[8]='1';
}
else
{
printf("\n Invalid hexa digit %u",(unsigned)PIN);
}
//selection command
return x;
}
else if(sw == 4)
{
if(PIN==0x00)
{
x[9]='0';
x[10]='0';
x[11]='0';
}
else if(PIN==0X01)
{
x[9]='1';
x[10]='0';
x[11]='0';
}
else if(PIN==0x02)
{
x[9]='0';
x[10]='1';
x[11]='0';
}
else if(PIN==0x03)
{
x[9]='1';
x[10]='1';
x[11]='0';
}
else if(PIN==0x04)
{
x[9]='0';
x[10]='0';
x[11]='1';
}
else if(PIN==0x05)
{
x[9]='1';
x[10]='0';
x[11]='1';
}
else if(PIN==0x06)
{
x[9]='0';
x[10]='1';
x[11]='1';
}
else if(PIN==0x07)
{
x[9]='1';
x[10]='1';
x[11]='1';
}
else
{
printf("\n Invalid hexa digit %u",(unsigned)PIN);
}
//selection command
return x;
}
else if(sw == 5)
{
if(PIN==0x00)
{
x[12]='0';
x[13]='0';
x[14]='0';
}
else if(PIN==0X01)
{
x[12]='1';
x[13]='0';
x[14]='0';
}
else if(PIN==0x02)
{
x[12]='0';
x[13]='1';
x[14]='0';
}
else if(PIN==0x03)
{
x[12]='1';
x[13]='1';
x[14]='0';
}
else if(PIN==0x04)
{
x[12]='0';
x[13]='0';
x[14]='1';
}
else if(PIN==0x05)
{
x[12]='1';
x[13]='0';
x[14]='1';
}
else if(PIN==0x06)
{
x[12]='0';
x[13]='1';
x[14]='1';
}
else if(PIN==0x07)
{
x[12]='1';
x[13]='1';
x[14]='1';
}
else
{
printf("\n Invalid hexa digit %u",(unsigned)PIN);
}
//selection command
return x;
}
else if(sw == 6)
{
if(PIN==0x00)
{
x[15]='0';
x[16]='0';
x[17]='0';
x[18]='0';
}
else if(PIN==0x01)
{
x[15]='1';
x[16]='0';
x[17]='0';
x[18]='0';
}
else if(PIN==0x02)
{
x[15]='0';
x[16]='1';
x[17]='0';
x[18]='0';
}
else if(PIN==0x03)
{
x[15]='1';
x[16]='1';
x[17]='0';
x[18]='0';
}
else if(PIN==0x04)
{
x[15]='0';
x[16]='0';
x[17]='1';
x[18]='0';
}
else if(PIN==0x05)
{
x[15]='1';
x[16]='0';
x[17]='1';
x[18]='0';
}
else if(PIN==0x06)
{
x[15]='0';
x[16]='1';
x[17]='1';
x[18]='0';
}
else if(PIN==0x07)
{
x[15]='1';
x[16]='1';
x[17]='1';
x[18]='0';
}
else if(PIN==0x08)
{
x[15]='0';
x[16]='0';
x[17]='0';
x[18]='1';
}
else if(PIN==0x09)
{
x[15]='1';
x[16]='0';
x[17]='0';
x[18]='1';
}
else if(PIN==0x0A)
{
x[15]='0';
x[16]='1';
x[17]='0';
x[18]='1';
}
else if(PIN==0x0B)
{
x[15]='1';
x[16]='1';
x[17]='0';
x[18]='1';
}
else if(PIN==0x0C)
{
x[15]='0';
x[16]='0';
x[17]='1';
x[18]='1';
}
else if(PIN==0x0D)
{
x[15]='1';
x[16]='0';
x[17]='1';
x[18]='1';
}
else if(PIN==0x0E)
{
x[15]='0';
x[16]='1';
x[17]='1';
x[18]='1';
}
else if(PIN==0x0F)
{
x[15]='1';
x[16]='1';
x[17]='1';
x[18]='1';
}
else
{
printf("\n Invalid hexa digit %u",(unsigned)PIN);
}
return x;
}
else if(sw == 7)
{
if(PIN==0x00)
{
x[19]='0';
x[20]='0';
x[21]='0';
}
else if(PIN==0X01)
{
x[19]='1';
x[20]='0';
x[21]='0';
}
else if(PIN==0x02)
{
x[19]='0';
x[20]='1';
x[21]='0';
}
else if(PIN==0x03)
{
x[19]='1';
x[20]='1';
x[21]='0';
}
else if(PIN==0x04)
{
x[19]='0';
x[20]='0';
x[21]='1';
}
else if(PIN==0x05)
{
x[19]='1';
x[20]='0';
x[21]='1';
}
else if(PIN==0x06)
{
x[19]='0';
x[20]='1';
x[21]='1';
}
else if(PIN==0x07)
{
x[19]='1';
x[20]='1';
x[21]='1';
}
else
{
printf("\n Invalid hexa digit %u",(unsigned)PIN);
}
//selection command
return x;
}
}
主要功能
int main()
{
int sw = 1,i,size=22;
char S3=0,S2=1,S1=0,S0=1;
unsigned char PIN;
PIN=set_lpx_var(S0,S1,S2,S3);
unsigned char *x;
unsigned char *d;
x=command(PIN,sw,size);//sw = 1
for (i = 0; i < size; i++)
{
if (x[i]!='\0')
{
d[i]=x[i];
}
}
sw = 2;
S3=0,S2=1,S1=1,S0=1;
PIN=set_lpx_var(S0,S1,S2,S3);
x=command(PIN,sw,size);
for (i = 0; i < size; i++)
{
if (x[i]!='\0')
{
d[i]=x[i];
}
}
sw = 3;
S3=0,S2=1,S1=0,S0=0;
PIN=set_lpx_var(S0,S1,S2,S3);
x=command(PIN,sw,size);
for (i = 0; i < size; i++)
{
if (x[i]!='\0')
{
d[i]=x[i];
}
}
sw = 4;
S3=0,S2=0,S1=1,S0=1;
PIN=set_lpx_var(S0,S1,S2,S3);
x=command(PIN,sw,size);
for (i = 0; i < size; i++)
{
if (x[i]!='\0')
{
d[i]=x[i];
}
}
sw = 5;
S3=0,S2=1,S1=1,S0=0;
PIN=set_lpx_var(S0,S1,S2,S3);
x=command(PIN,sw,size);
for (i = 0; i < size; i++)
{
if (x[i]!='\0')
{
d[i]=x[i];
}
}
sw = 6;
S3=1,S2=1,S1=1,S0=0;
PIN=set_lpx_var(S0,S1,S2,S3);
x=command(PIN,sw,size);
for (i = 0; i < size; i++)
{
if (x[i]!='\0')
{
d[i]=x[i];
}
}
sw = 7;
S3=0,S2=1,S1=1,S0=0;
PIN=set_lpx_var(S0,S1,S2,S3);
x=command(PIN,sw,size);
for (i = 0; i < size; i++)
{
if (x[i]!='\0')
{
d[i]=x[i];
}
}
for (i = 0; i < size; i++)
{
{
printf("Value at %i is %c",i,d[i]);
}
}
}
一个快速的方法来优化你的第一功能,同时降低了出错的可能性:
//Function to get hex condition
unsigned char set_lpx_var(char s0, char s1, char s2, char s3)
{
unsigned char result = (unsigned char)(((s3 != 0) << 3) + ((s2 != 0) << 2)
+ ((s1 != 0) << 1) + (s0 != 0));
printf("\n Obtained hexa digit %u", result);
return result;
}
功能#2:
unsigned char* command(unsigned char PIN,int sw,int size)
{
unsigned char* x;
size_t offset = sw - 1;
if (PIN & 0x08) // hard to know from your code what to do in case
// of error here.
{
printf("\n Invalid hexa digit %u", PIN);
return NULL;
}
if (size < 22 || (sw < 1 || 7 < sw)) // avoid out-of-bounds errors
{
printf("\n Invalid buffer size %d", size);
return NULL;
}
x = (unsigned char*)malloc(size); // why not new ?
// why not passing an array for result?
if (!x)
return NULL;
memset(x, 0, size); // dynamic memory needs to be initialized.
//select line assignment to array
size_t offset = sw - 1;
x[offset + 0] = (PIN & 0x01) ? '1' : '0';
x[offset + 1] = (PIN & 0x02) ? '1' : '0';
x[offset + 2] = (PIN & 0x04) ? '1' : '0';
return x;
}
至于main()中,你不检查分配错误在command()的返回值中,你泄漏了command()返回的每一个缓冲区,并且把值赋给d,这是一个未初始化的指针,这很可能会产生一个分段错误。
未使用的新功能是因为我使用的是Keil,如果有其他噩梦是因为我的指针技能较弱。感谢您的协助! – aurelius
unsigned char *d; // <-- d is an uninitialized pointer
x=command(PIN,sw,size);//sw = 1, ****x is assigned a block of memory within command so that's good****
for (i = 0; i < size; i++)
{
if (x[i]!='\0')
{
d[i]=x[i]; // ****<-- where did you assign d to a block of memory?****
}
}
最我看到的明显问题是对未初始化的指针d的赋值。您需要为此分配一块内存。程序中还可能存在其他问题,您需要进行调试才能找到。
错过了那个权利!我一定很困。代码现在返回一个0和1的完整数组,以及一些垃圾值,如y和笑脸。 – aurelius
请在发布问题时使用适当的缩进来格式化您的代码。你的代码很难阅读。此外,将主函数和全局函数放在一个代码块中可能会更好,以便愿意帮助您的人员可以更轻松地将其复制并粘贴到项目中并进行编译。你在使用调试器吗?如果是这样,在程序开始行为不当之前你有多远? – shawn1874
自从我将代码缩小为8空间规则以来,我很抱歉这个混乱。完全错过了代码块图标。获取PIN十六进制值后,问题就开始了。一旦命令功能启动,屏幕就会冻结。我认为这是一个松散的指针,但我不能太确定。真的会很欣赏这件事上一双清新的眼睛。 – aurelius
创建一个“PIN”值与“S0”,“S1”,“S2”和“S3”值的表格。你会看到一个图案或者制作一个Karnough地图来减少它。 –