【问题标题】:Equal to operator "==" is behaving like assignment operator "=" [closed]等于运算符“==”的行为类似于赋值运算符“=” [关闭]
【发布时间】:2015-04-09 11:43:52
【问题描述】:

我面临一个非常奇怪的问题。

- 我有一个 if 条件:

if((IN_SYNC == sync_flag) || (cycle_number == spi_slot_number))

在条件之前,变量“spi_slot_number”为'7',在if条件之后变为'0'(即“cycle_number”的值)!!!

有没有人知道怎么会发生这种事?!

重要提示:

1- 我的代码是 C 语言的。

2- 我检查了条件前后的堆栈,以确保没有发生堆栈损坏。

3-我的程序是一个线程程序,所以没有中断或其他线程可以中断。

4- 如果我注释了 if 条件,一切都会好起来的。

5-我不知道如何生成汇编代码...

【问题讨论】:

  • 这通常来自未定义的行为和/或线程问题。
  • 我们需要更多代码,而不仅仅是if 声明。
  • 发布更多代码。我绝对不相信。
  • 我会解决您对调试器对发布优化代码的误解的困惑。
  • 请添加printf 说明您的问题的语句。另外,请尽量减少您的代码,以便问题仍然存在(制作minimal, complete, and verifiable example)。另外,请更新您的问题 - if(cycle_number == spi_slot_number) 没有出现在“确切代码”中。

标签: c conditional-operator


【解决方案1】:

正如其他人所说,您没有共享足够的代码来实际确定问题所在。然而,我想到的一个想法是IN_SYNC 标识符。将宏全部大写是一种标准的编码约定,如果它是一个宏,它可能是在做坏事。检查IN_SYNC 的定义。

另外一件事——你的if 测试有两个测试,用|| 分隔。操作员。尝试将这两个测试分开,看看哪一个导致您的副作用。像这样的:

printf("%d \n", spi_slot_number);
if (IN_SYNC == sync_flag) { 
    /* do nothing */
    }
printf("after IN_SYNC test %d \n", spi_slot_number);
if (cycle_number == spi_slot_number) {
    /* do nothing */
    }
printf("after cycle_number test %d \n", spi_slot_number);

【讨论】:

  • 我做到了,条件“cycle_number == spi_slot_number”是导致问题的原因。
  • 如果这是 Wind River 嵌入式编译器,请尝试检查 PreProcessor 输出(使用 -E 命令行选项)以确认没有您不希望发生的事情。如果看起来没问题,则使用 -S 命令行选项生成程序集输出并检查机器代码。如果看起来没问题,要么是硬件有问题,要么是在编译器工具链中发现了一个错误(也许是链接器的错?)——你应该向 Wind River 提交错误报告。
【解决方案2】:

如果您对 spi_slot_number 的临时副本进行比较会发生什么?它是否按预期工作?

void GetData(slot_id_T spi_slot_number, uint8_t* data_received,
         uint16_t data_length, uint8_t data_is_valid_flag)
 {
     uint8_t cycle_number;
     slot_id_T copy = spi_slot_number; // <- ADDED

     cycle_number = GetCycleNumber() + 1;
     if(cycle_number > LAST_CYCLE)
     {
         cycle_number = 0;
     }

     printf("%d \n", spi_slot_number);

     if((IN_SYNC == sync_flag) || (cycle_number == copy)) // <- CHANGE
     {
         printf("%d \n", spi_slot_number);

         switch(data_is_valid_flag)
         {
         case DATA_IS_VALID:
             SendData(spi_slot_number, p_buffer, data_length);
             break;

         case DATA_IS_NOT_VALID:
             IndicateDataNotValid(spi_slot_number, p_buffer, data_length);
             break;

         default:
             /* Do Nothing */
             break;
         }
      }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 2013-10-26
    • 2012-05-26
    • 2015-12-06
    • 2011-05-29
    相关资源
    最近更新 更多