Как сравнивать массивы целых чисел?

У меня есть четыре датчика (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)));
}

person Khali    schedule 15.04.2011    source источник
comment
В sprintf(sen_array,"%d%d%d%d%d",sen0,sen1,sen2,sen3); у вас есть 5 спецификаторов формата %d и только 4 переменные.   -  person Ryan    schedule 15.04.2011
comment
пожалуйста, покажите, как вы объявляете sen_array.   -  person Mat    schedule 15.04.2011
comment
sprintf()? strcmp? Это точно С++? Также sen[0-3] всегда bool?   -  person Johnsyweb    schedule 15.04.2011
comment
1. Если sen0-3 будет больше 9, у вас будет переполнение памяти.   -  person W55tKQbuRu28Q4xv    schedule 15.04.2011
comment
2. использовать int sen_array[4]; и memcmp (sen_array, _OOOO) или memcpy (sen_array, _1000)   -  person W55tKQbuRu28Q4xv    schedule 15.04.2011


Ответы (4)


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

char sen_array[5];
person ildjarn    schedule 15.04.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 */ }
person Rune Aamodt    schedule 15.04.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' в sen_array - переполняет его и, возможно, влияет на близлежащую переменную

Используйте char sen_array[5];

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

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

if (sa == 1000) {
  ...
} else if (sa == 1001) {
  ...
}
person Erik    schedule 15.04.2011
comment
@Khali: sen_array должен иметь длину не менее 5 символов. - person Erik; 15.04.2011
comment
@Khali: sprintf 0-terminates - он напишет ваши четыре целых числа, за которыми следует символ '\ 0' - это переполняет ваш текущий sen_array и может привести к чему угодно. - person Erik; 15.04.2011
comment
@Johnsyweb: В OP указано, что переменные send имеют значение 0 или 1. - person Erik; 15.04.2011

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

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

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

person jack_carver    schedule 15.04.2011