Как сравнить целочисленные массивы? - PullRequest
0 голосов
/ 15 апреля 2011

У меня есть четыре датчика (sen0-sen3), которые возвращают либо 1, либо 0, и я делаю массив значений, используя sprintf.Затем я пытаюсь сравнить их с 0000 или 1000 и т. Д.

Моя проблема в том, что даже если значение sen_array равно 1000, оно никогда не переходит в состояние 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 голосов
/ 15 апреля 2011

То, что вы видите, является артефактом повреждения памяти. Проблема в том, что вы объявили sen_array как char[4], что не оставляет места для завершающего нуля. Изменить sen_array на:

char sen_array[5];
2 голосов
/ 15 апреля 2011

Не используя STL, я думаю, что лучший способ сравнения целочисленных массивов - это использование функции memcmp, которая сравнивает блоки памяти.

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 */ }
1 голос
/ 15 апреля 2011

Я думаю, что sen_array должен быть длиной не менее 5 символов, и если вы не используете sen_array для чего-то другого, лучше и быстрее сделать

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

И используйте это для сравнения.

1 голос
/ 15 апреля 2011

Ваш sen_array должен быть длиной не менее 5 символов - чтобы освободить место для 0-терминатора.

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

Выше написано: «1», «2», «3», «4», «\ 0».to sen_array - переполнение и, возможно, влияние на соседнюю переменную

Использование char sen_array[5];

Возможно, лучшим решением будет работа с целым числом:

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

if (sa == 1000) {
  ...
} else if (sa == 1001) {
  ...
}
...