невозможно вернуть «истинное» значение в функции C - PullRequest
2 голосов
/ 22 марта 2010

Если я пытаюсь проверить входной 5-байтовый массив (p) по сравнению с 5-байтовым массивом, хранящимся во флэш-памяти (data), используя следующую функцию (e2CheckPINoverride), чтобы просто вернуть либо значение true, либо false. Но, похоже, что бы я ни пытался, он возвращает только «ложь».

Я вызываю функцию здесь:

if (e2CheckPINoverride(pinEntry) == 1){
  PTDD_PTDD1 = 1; 
}
else{
  PTDD_PTDD1 = 0; 
}

Вот функция:

BYTE e2CheckPINoverride(BYTE *p)
{
    BYTE i;
    BYTE data[5];

if(e2Read(E2_ENABLECODE, data, 5)) {
    if(data[0] != p[0]) return FALSE;
    if(data[1] != p[1]) return FALSE;
    if(data[2] != p[2]) return FALSE;
    if(data[3] != p[3]) return FALSE;
    if(data[4] != p[4]) return FALSE;
}
return TRUE;
}

Я уже назначил true и false в файле define.h:

#ifndef TRUE
    #define TRUE ((UCHAR)1)
#endif

#ifndef FALSE
    #define FALSE ((UCHAR)0)
#endif

и где

typedef unsigned char   UCHAR;

Когда я перебираю код, он правильно выполняет все проверки, передает правильное значение, сравнивает его правильно, а затем прерывает в правильной точке, но не может обработать возвращаемое значение true?

пожалуйста, помогите?

Ответы [ 7 ]

4 голосов
/ 22 марта 2010
#define TRUE 1
#define FALSE 0

Забудьте неподписанный символ. Вы можете исходить из того, что в c 0 ложно, все остальное верно

2 голосов
/ 22 марта 2010

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

PTDD_PTDD1 = e2CheckPINoverride(pinEntry) ? 1 : 0;

Кроме того, вы смешиваете байты и символы UCHAR (хотя они, вероятно, совпадают)

1 голос
/ 22 марта 2010

IMO, вы создаете массу ненужных сложностей. Я бы написал функцию примерно так:

int e2CheckPINoverride(BYTE *p) {
    BYTE data[5];

    return e2Read(E2_ENABLECODE, data, 5) && 
        data[0] == p[0] &&
        data[1] == p[1] &&
        data[2] == p[2] &&
        data[3] == p[3] &&
        data[4] == p[4];
}

И вызывающий код становится просто:

PTDD_PTDD1 = e2CheckPINoverride(pinEntry);
1 голос
/ 22 марта 2010

Если вы вернете TRUE или FALSE, вам также следует проверить их. Перепишите предложение if следующим образом:

   if (e2CheckPINoverride(pinEntry) == TRUE) { // instead of '== 1'
1 голос
/ 22 марта 2010

Попробуйте сузить это, отказавшись от #define и просто сказав

return 1;

Если это работает, значит, что-то не работает с вашим # define.

0 голосов
/ 22 марта 2010

Просто небольшой пример, который я протестировал на работу.Я не знаю, что такое e2Read, поэтому я сделал просто пустышку

#ifndef UCHAR
    typedef unsigned char   UCHAR;
#endif
#ifndef BYTE
    typedef  char   BYTE;
#endif
#ifndef TRUE
    #define TRUE ((UCHAR)1)
#endif
#ifndef FALSE
    #define FALSE ((UCHAR)0)
#endif
int e2Read(int myconst, BYTE* data, int num)
{
    int i;
    for(i=0;i<num;i++)
        *(data++) = 0; // You can change thisone to test different results.
    return 1;
}
BYTE e2CheckPINoverride(BYTE *p)
{
#define E2_ENABLECODE 3
    BYTE data[5];
    if(e2Read(E2_ENABLECODE, data, 5)) {
    if(data[0] != p[0]) return FALSE;
    if(data[1] != p[1]) return FALSE;
    if(data[2] != p[2]) return FALSE;
    if(data[3] != p[3]) return FALSE;
    if(data[4] != p[4]) return FALSE;
    }
    return TRUE;
}
int main(void)
{
    BYTE b[5] = {0,0,0,0,0};// You can change thisone to test different results.
    BYTE* pinEntry = b;
    if (e2CheckPINoverride(pinEntry) == 1){
        printf("Returned true\n");
    }
    else{
        printf("Returned false\n");
    }
    return 0;
}
0 голосов
/ 22 марта 2010

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

BYTE data[5];

Итак, вы сравниваете элементы из массива p со случайными значениями из данных массива.Почти всегда он возвращает FALSE.

Вывод: заполните массив данных значимыми данными.

...