0

1またはを返す 4 つのセンサー (sen0-sen3) があり0、 を使用して値の配列を作成していますsprintf0000次に、それらをorなどと比較しようとして1000います。

私の問題は、の値がsen_arrayis1000であっても、決してelse if条件に入らないことです(条件にまっすぐelse)。

char sen_array[4];

sprintf(sen_array,"%d%d%d%d",sen0,sen1,sen2,sen3);
if(strcmp("0000",sen_array)==0)
{
    motor_pwm((156*(0.20).),(156*(0.20)));
}
else if(strcmp("1000",sen_array)==0)
{
    motor_pwm((156*(0.40)),(156*(0.40)));
}
else
{
    motor_pwm((156*(0.80)),(156*(0.80)));
}
4

4 に答える 4

4

あなたが見ているのは、メモリ破損のアーティファクトです。問題は、終了する null の余地を残さない であると宣言sen_arrayしたことです。char[4]変更sen_array:

char sen_array[5];
于 2011-04-15T11:49:42.920 に答える
2

memcmpSTL を使用しない場合、整数配列を比較する最良の方法は、メモリのブロックを比較する関数を使用することだと思います。

int sen_array1[] = { 1, 2, 3, 4 } ;
int sen_array2[] = { 1, 2, 3, 4 } ;
if(memcmp(sen_array1, sen_array2, sizeof(int)*4) == 0) { /* do something */ }
于 2011-04-15T11:49:47.070 に答える
1

sen_array は少なくとも 5 文字の長さである必要があると思います。sen_array を他の目的で使用していない限り、より適切で高速な方法は次のとおりです。

int res = 1000*sen0+100*sen1+10*sen2+sen3;

そしてこれを使って比較します。

于 2011-04-15T11:52:24.037 に答える
1

sen_array は少なくとも 5 文字の長さである必要があります - 0 ターミネータのためのスペースを確保するためです。

char sen_array[4];
sprintf(sen_array, "%d%d%d%d", 1, 2, 3, 4);

上記は '1' '2' '3' '4' '\0' を sen_array に書き込みます - オーバーフローし、近くの変数に影響を与える可能性があります

使用するchar sen_array[5];

おそらくより良い解決策は、整数を使用することです。

int sa = sen0 * 1000 + sen1 * 100 + sen2 * 10 + sen3;

if (sa == 1000) {
  ...
} else if (sa == 1001) {
  ...
}
于 2011-04-15T11:45:20.870 に答える