2017-08-28 5 views
-3

私は趣味のプロジェクトに取り組んでいました。特定の16進関数呼び出しに基づいて配列に16進値を割り当てる必要があります。しかし、配列は返されず、単に実行時にプログラムがフリーズされます。いくつかの洞察を求めてください。特定の場所でswitchまたはif-elseステップを使用して配列に16進値を割り当てる方法はありますか?

次に、返された符号なし文字配列を取得し、NULL値のない2番目の配列に移動する必要があります。これは私のメインプログラムで使用します。

おかげで、 アウレリウス配列に進値を割り当てる

//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]); 
    } 
    } 
    }  
+0

質問を投稿するときは、適切な字下げでコードを書式設定してください。あなたのコードは読みにくいです。また、主要な関数とグローバル関数を1つのコードブロックに入れて、助けてくれる人がプロジェクトにコピー&ペーストしてコンパイルできるようにする方がいいでしょう。デバッガを使用していますか?そうであれば、プログラムが不正行為を開始する前にどれくらい前に取得しましたか? – shawn1874

+0

私はコードを8スペースルールとしてサイズにカットして以来、本当に混乱のために申し訳ありません。完全にコードブロックアイコンを見逃しました。問題は、PINの16進値を取得した後に始まります。コマンド機能が起動すると、画面がフリーズします。私はそれがどこかでゆるいポインタだと思うが、私はあまり確かではない。このことについて、本当に新しい目を見ていただければ幸いです。 – aurelius

+0

「PIN」値と「S0」、「S1」、「S2」、および「S3」値のテーブルを作成します。あなたはパターンを見るか、それを減らすKarnoughマップを作成します。 –

答えて

0

エラーの可能性を低減しながら、あなたの最初の関数を最適化する簡単な方法:

//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; 
} 

)を、あなたは、割り当てエラーをチェックしません。 command()からの戻り値では、command()によって返されたすべての単一バッファをリークし、dに初期化されていないポインタである値を代入します。

+0

Keilを使用しているので、新しい使用されていないと私の弱いポインターのスキルのために他の悪夢があります。助けてくれてありがとう! – aurelius

0
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

バットからすぐにそれを逃した!私は眠くなっているはずです。このコードでは、yやスマイリーのようなガベージ値と共に、0と1の完全な配列を返します。 – aurelius

関連する問題