无法返回';正确';C函数中的值
如果我试图使用以下函数(e2CheckPINoverride)对照闪存(数据)中存储的5字节数组检查输入5字节数组(p),只需返回真值或假值。 但是,无论我尝试什么,它似乎只会返回为“false” 我在这里调用函数:无法返回';正确';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
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”的函数,所有的赌注都会被取消。