无法在C函数中返回'true'值

时间:2010-03-22 12:19:50

标签: c return-value variable-assignment

如果我试图检查输入5字节数组(p)对存储在flash(数据)中的5字节数组,使用以下函数(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;
}

我已经在define.h文件中指定了true和false:

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

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

typedef unsigned char   UCHAR;

当我单步执行代码时,它会正确执行所有检查,传递正确的值,正确比较然后在正确的点处中断,但是无法处理返回值true?

请帮帮忙?

7 个答案:

答案 0 :(得分:4)

#define TRUE 1
#define FALSE 0

忘记unsigned char。你可以假设在c 0是假的,其他一切都是真的

答案 1 :(得分:2)

可能不会解决你的问题,但你应该写:

PTDD_PTDD1 = e2CheckPINoverride(pinEntry) ? 1 : 0;

此外,您正在混合使用BYTE和UCHAR(即使它们可能相同)

答案 2 :(得分:1)

尝试通过免除#define并简单地说

来缩小范围
return 1;

如果可以,那么某些东西不适用于你的#define。

答案 3 :(得分:1)

如果您返回TRUEFALSE,您还应该检查它们。像这样重写if子句:

   if (e2CheckPINoverride(pinEntry) == TRUE) { // instead of '== 1'

答案 4 :(得分:1)

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);

答案 5 :(得分:0)

我测试过的一个小例子。我不知道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;
}

答案 6 :(得分:-1)

您的数据数组从未初始化,因此内部具有随机值。

BYTE data[5];

因此,您要将数组p中的元素与数组数据中的随机值进行比较。它几乎总是返回FALSE。

结论: 用有意义的数据填充数据数组。