Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法返回';正确';C函数中的值_C_Return Value_Variable Assignment - Fatal编程技术网

无法返回';正确';C函数中的值

无法返回';正确';C函数中的值,c,return-value,variable-assignment,C,Return Value,Variable Assignment,如果我试图使用以下函数(e2CheckPINoverride)对照闪存(数据)中存储的5字节数组检查输入5字节数组(p),只需返回真值或假值。 但是,无论我尝试什么,它似乎只会返回为“false” 我在这里调用函数: if (e2CheckPINoverride(pinEntry) == 1){ PTDD_PTDD1 = 1; } else{ PTDD_PTDD1 = 0; } 以下是函数: BYTE e2CheckPINoverride(BYTE *p) { BYTE i

如果我试图使用以下函数(e2CheckPINoverride)对照闪存(数据)中存储的5字节数组检查输入5字节数组(p),只需返回真值或假值。 但是,无论我尝试什么,它似乎只会返回为“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;
}
我已经在defines.h文件中指定了true和false:

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

#ifndef FALSE
    #define FALSE ((UCHAR)0)
#endif
在哪里

typedef unsigned char   UCHAR;
当我逐步检查代码时,它正确地执行所有检查,它传入正确的值,进行正确的比较,然后在正确的点断开,但无法处理返回值true

请帮忙

#define TRUE 1
#define FALSE 0

忘记未签名字符。你可以假设c 0为假,其他一切都是真的

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

PTDD_PTDD1 = e2CheckPINoverride(pinEntry) ? 1 : 0;

此外,您正在混合字节和uchar(即使它们可能是相同的)

尝试通过省去#define并只说

return 1;

如果这样做有效,那么您的#define's就不起作用了。

您的数据数组从未初始化过,因此其中包含随机值

BYTE data[5];
因此,您正在将数组p中的元素与数组数据中的随机值进行比较。它几乎总是返回FALSE

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

如果返回
TRUE
FALSE
,还应检查它们。重写
if
子句,如下所示:

   if (e2CheckPINoverride(pinEntry) == TRUE) { // instead of '== 1'
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];
}

依我看,你在制造大量不必要的复杂性。我会这样写函数:

   if (e2CheckPINoverride(pinEntry) == TRUE) { // instead of '== 1'
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);

只是一个小例子,我测试工作。我不知道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;
}
\ifndef UCHAR
typedef无符号字符;
#恩迪夫
#ifndef字节
typedef字符字节;
#恩迪夫
#如果是真的
#定义真((UCHAR)1)
#恩迪夫
#ifndef FALSE
#定义FALSE((UCHAR)0)
#恩迪夫
int e2Read(int myconst,字节*数据,int num)
{
int i;

对于(i=0;i您可以将您的调用更改为
BYTE ret=e2CheckPINoverride(pinEntry);if(ret==1){PTDD_PTDD1=1;}else{PTDD_PTDD1=0;}
并告诉我们ret的值?@Vlad-解决了这个问题!这似乎是一个任意的改变,你能向我解释一下,区别是什么吗?所以我的代码现在看起来是这样的
ret=(e2CheckPINoverride(pinEntry));//其中ret被分配为字节if(ret==1){PTDD_PTDD1=1;}否则{PTDD_PTDD1=0;}
并且它工作正常,当为false时分配“0”,当为true时分配“1”。谢谢!这可能取决于字节的实际定义。可能已经定义了
true
false
,因此您的
#ifdef
-ed代码实际上从未执行过?您应该在函数返回时使用汇编对其进行调试,以了解这一点工作并查看可能的问题,甚至只是PTDD_PTDD1=E2CheckPinorride(pinEntry)@David Well从技术上讲,布尔值true是非零值,如果PTDD_PTDD1应该是0或1,我将不信任返回值,并自行将PTDD_PTDD1设置为0或1。当然,如果PTDD_PTDD1也是布尔值,那么您的建议是正确的。Tuomas,您正在假设函数在两种实现中返回的值为了正确,您需要将返回值与define进行比较:
PTDD_PTDD1=(e2CheckPINoverride(pinEntry)==TRUE?1:0);
@Yannick我不同意,如果您知道某个函数返回的是布尔值(如果为TRUE,则为非零),那么e2CheckPINoverride(pinEntry)?1:0是正确的方法。C没有布尔类型。该函数返回一个字节(在本上下文中可能是一个无符号字符),该值要么是
TRUE
的值,要么是
FALSE
定义的值。在本例中,您假设的值要么是非零,要么是零。e2Read()这是e2Read()'字节e2Read(字节地址,字节*数据,字节len){BYTE n;for(n=0;nif(xxx!=0)
或者只使用
if(xxx)
,从不与任何其他值进行显式比较。@Jerry-除了这里他定义了一个宏TRUE==1,“TRUE”,如果他测试函数的返回值,那就错了。@Martin:我不同意。定义“TRUE”很好,但应该始终被视为只写值——即,将某个值设置为TRUE是可以的,但您仍然不应该与它进行比较。是的,与“TRUE”进行比较是不好的。但这里TRUE是他在返回和测试中定义的一个标记。它可以等于“黄色纸杯蛋糕”当然,一旦有人进来并添加了一个返回“true”的函数,所有的赌注都会被取消。