【问题标题】:unable to return 'true' value in C function无法在 C 函数中返回“真”值
【发布时间】:2011-01-30 07:55:38
【问题描述】:

如果我尝试使用以下函数 (e2CheckPINoverride) 来检查输入的 5 字节数组 (p) 与存储在闪存中的 5 字节数组(数据),以简单地返回 true 或 false 值。 但似乎无论我尝试什么,它都只会返回“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文件中赋值了真假:

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

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

在哪里

typedef unsigned char   UCHAR;

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

请帮忙?

【问题讨论】:

  • 能否请将您的电话改为BYTE ret = e2CheckPINoverride(pinEntry); if (ret == 1) { PTDD_PTDD1 = 1; } else { PTDD_PTDD1 = 0; } 并告诉我们ret 的值?
  • @Vlad - 解决了它!这似乎是一个随意的改变,你能向我解释一下,有什么不同吗?所以我的代码现在看起来像这样ret= (e2CheckPINoverride(pinEntry)); //where ret is assigned as BYTE if (ret==1) { PTDD_PTDD1 = 1; } else{ PTDD_PTDD1 = 0; } 并且它工作正常,当为假时分配'0',当为真时分配'1'。谢谢!
  • 这可能取决于 BYTE 的实际定义。也许TRUEFALSE 已经定义了,所以你的#ifdef-ed 代码实际上永远不会执行?
  • 您应该在函数返回时使用程序集对其进行调试,以了解其工作原理并查看可能出现的问题

标签: c return-value variable-assignment


【解决方案1】:
#define TRUE 1
#define FALSE 0

忘记无符号字符。您可以假设在 c 0 中为假,其他一切都为真

【讨论】:

    【解决方案2】:

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

    PTDD_PTDD1 = e2CheckPINoverride(pinEntry) ? 1 : 0;
    

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

    【讨论】:

    • 甚至只是 PTDD_PTDD1 = e2CheckPINoverride(pinEntry);
    • @David Well 从技术上讲,布尔值 true 是一个非零值,如果 PTDD_PTDD1 应该为 0 或 1,我将不相信返回值并自己将 PTDD_PTDD1 设置为 0 或 1。当然,如果 PTDD_PTDD1 也是布尔值,那么你的提议是正确的。
    • Tuomas,您正在假设函数将在任一实现中返回什么值。为了正确,您需要将返回值与定义进行比较:PTDD_PTDD1 = (e2CheckPINoverride(pinEntry) == TRUE ? 1 : 0);
    • @Yannick 我不同意,如果你知道一个函数返回一个布尔值(为真时非零),那么 e2CheckPINoverride(pinEntry) ? 1 : 0 是正确的做法。
    • 嗯,C 没有布尔类型。该函数返回一个 BYTE(在此上下文中可能是一个无符号字符),该值将是 TRUEFALSE 定义的值。在这种情况下,您假设将是非零或零。
    【解决方案3】:

    尝试通过省略#define 并直接说来缩小范围

    return 1;
    

    如果这有效,那么您的#define 有什么问题。

    【讨论】:

    • 是的,thx 已经尝试通过以下方法消除这种可能性:if(e2Read(E2_ENABLECODE, data, 5)) { indicator = 1; if(data[0] != p[0]){ 指标 = 0;返回指示器; } if(data[1] != p[1]){ 指标 = 0;返回指示器; } if(data[2] != p[2]){ 指标 = 0;返回指示器; } if(data[3] != p[3]){ 指标 = 0;返回指示器; } if(data[4] != p[4]){ 指标 = 0;返回指示器; } } 返回指示符;不高兴:(
    • 抱歉,一团糟。我是这个论坛的新手,要创建一个代码块,它说缩进至少四个空格?还是标签?好像没戏?
    • 要在 cmets 中添加代码块,请使用反引号将其包围(但请记住,cmets 是单行的)。但我建议您在问题中进一步详细说明。
    【解决方案4】:

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

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

    【讨论】:

    • 这是一个真的糟糕的主意,IMO。在 C 中,任何和所有非零值都是 true,因此您应该使用 if (xxx != 0) 或只使用 if (xxx)从不与任何其他值进行显式比较。
    • @Jerry - 除了这里他定义了一个宏 TRUE==1, 'true' 如果他在测试函数的返回值是错误的。
    • @Martin:我不同意。定义“TRUE”非常好,但应始终将其视为只写值 - 即可以将某些内容设置为 TRUE,但您仍然不应该与它进行比较。
    • 是的,与“真”相比是不好的。但这里的 TRUE 是他在返回和测试中定义的标记。它可能等于“黄色纸杯蛋糕”,但仍然有意义。当然,一旦有人进来并添加了一个返回“真”的函数,所有的赌注都会被取消。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        您的数据数组从未初始化,因此它内部包含随机值。

        BYTE data[5];
        

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

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

        【讨论】:

        • e2Read() 可能完成了那部分。将某些内容读入数据。也许吧。
        • 是的。这里是 e2Read() 'BYTE e2Read(BYTE address, BYTE *data, BYTE len) { BYTE n; for(n = 0; n
        • 是的。我现在看到了。对不起。下次会更加小心。
        猜你喜欢
        • 2015-06-21
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 2013-04-22
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多