2013-06-19 2 views
1

У меня есть массив без знака, такой как Data[2]. Мне нужно было это сравнить с выходом функции, возвращающей unsigned int.сравнение между unsigned int и unsigned char

Я попытался отличить Data[2] в неподписанном int и наоборот. Это не сработало.

То, что я пытаюсь сделать, это:

if (Data[2] == ReadFlash2(40)) 
{ 
    //Do Something. 
} 

ReadFlash2 является функция, возвращающая беззнаковое Int, в то время как Data[2] это символ без знака.

Я попытался отбросить каждую из них, но это не сработало.

Есть ли что-то, что я делаю неправильно? Кого я должен бросить, и на что мне его бросить?

Спасибо.

Edit: код для функции Readflash:

unsigned int ReadFlash2(unsigned int Addr) // use as Read Function 
{ 
pMem = (unsigned int*)MEM_STR_ADR; 
pMem += Addr; 
Nop(); 
return(*pMem); 
} 
+2

Какая у вас ошибка? –

+1

@AlexandruBarbarosie, сравнение 'if' неверно, то есть оно не проходит. – Liban

+0

Каково значение 'Data [2]' и значение 'ReadFlash2 (40)'? –

ответ

1

Похоже, что вы получаете доступ к энергозависимой памяти на микроконтроллере, и это может вызвать некоторую путаницу при отладке.Попробуйте хранить Data[2] и ReadFlash(40) в переменные перед сравнением:

unsigned char data_2 = Data[2]; 
unsigned int readflash2_40 = ReadFlash2(40); 

if (data_2 == readflash2_40) 
{ 
    //Do Something. 
} 

Теперь вы должны быть в состоянии проверить фактические значения, которые сравниваются, глядя на значения в переменных.

+0

Я тоже подумал .. я сделал то же самое, но все же сделал Не работай. чтобы проверить, одинаковы ли значения, я отправил их на хост, и это одно и то же. – Liban

+0

Vaughn, странная вещь: когда я обращаюсь непосредственно к 'ReadFlash2 (40)' это '1', но когда я храню в переменной, это' 00'. – Liban

+0

@Liban: Может быть, значение меняется. Возможно, когда вы впервые вызывали ReadFlash2 (40), чтобы отправить его на хост, это было одно значение, и когда вы вызываете его в следующий раз, чтобы выполнить сравнение, это было другое значение. –

3

Вы не должны бросать их на всех, правила в C, относящиеся к неявным поощрений должны заботиться о том, что для вас.

Другими словами, сравнивая unsigned char Ань unsigned int будет первым способствовать unsigned char, чтобы быть совместимым, затем сделать сравнение.

Это все покрыто C99 6.3.1.8 Usual arithmetic conversions, которая гласит (после обсуждения типов с плавающей запятой):

В противном случае, целые акции выполняются на обоих операндов.

Тогда следующие правила применяются к рекламируемым операндам:

Если оба операнда имеет один и тот же тип, то никаких дальнейших преобразования не нужно.

В противном случае, если оба операнда подписали целочисленные типы или оба имеют неподписанные целочисленных типов, операнд с типом меньшего ранга целочисленного преобразования в преобразуется к типу операнда с большим рангом.

... и так далее, но последний абзац выше применим.

Если типы, как вы заявили, и Data[2] фактически является то же значение, что вернулся из ReadFlash2(40), то это не среда C, по крайней мере, не в соответствии со стандартом.

+1

@ Liban, ну, это либо C, либо нет C. Если это C, он будет следовать правилам. Если это не соответствует правилам, оно должно быть изменено как «близко к C, но не совсем» :-) – paxdiablo

+0

, так вы предлагаете продвигать 'unsigned char' в' unsigned int'? – Liban

+0

Нет, я предполагаю, что это не обязательно, если у вас есть реальная среда C. Вы могли бы _try_ явно продвигать символ, и это может сработать, но вы вне пределов моего опыта там, так как у меня мало знаний о несоответствующих C-подобных средах :-) – paxdiablo