【问题标题】:Why is this condition always true?为什么这个条件总是正确的?
【发布时间】:2013-02-22 05:20:10
【问题描述】:

语言:C 图片:16F84A 程序:CCS PCW

当我编译以下代码时,我的编译器抱怨 FOR 始终为真(也许 int 我不支持负值?):

#include <16F84A.h>
#FUSES XT
#use delay(clock=4M)
byte const display[10] = {63,6,91,79,102,109,124,7,127,103};

void main()
{
   set_tris_b(0);
   while(True)
   {
   int i;
      for(i=9;i>=0;--i)
      {
         output_b(display[i]);
         delay_ms(300);
      }
   }
}

它的 PIC Countdown 项目,所以: 9,8,7,6,5,4,3,2,1,0,9,8,7,6,5,4,3,2,1,0,9,8,7,6,.. . 但它在第一个周期后停止。

【问题讨论】:

  • 如果语言是C,为什么有5个语言标签?
  • 如果这是 Microchip PIC 编译器:那就是垃圾。他们的整个 IDE 120% 坏了,不要相信任何“静态分析”结果。
  • 您的While 条件始终为真。 for loop 永无止境地运行着。没有办法摆脱循环。
  • “for”循环一切正常。问题出在while循环中
  • 老兄,这解决了。我只是改变:“int i”为“signed int i”

标签: c embedded microcontroller pic


【解决方案1】:

使用

    signed int i;

而不是

    int i;

默认情况下,CCS 编译器中的整数是无符号的。

http://www.ccsinfo.com/downloads/ccs_c_manual.pdf

查看第 38 页

“所有类型,除了浮点数,默认都是无符号的;但是,[它们]前面可以有无符号或有符号。

【讨论】:

  • -1 不,这个答案明显是错误的,int 默认是签名的。
  • @Lundin ,感谢您在没有仔细检查的情况下投票! ccsinfo.com/downloads/ccs_c_manual.pdf 检查第 38 页“所有类型,除了浮点数,默认情况下都是无符号的;但是,[它们] 前面可能有无符号或有符号。”
  • 如果你的答案只适用于一些非标准的垃圾编译器,你应该明白这一点。否则,我们将不得不假设您的答案是关于 C 编程语言的,而您的答案是不正确的。请参阅标准 C11 6.2.5。
  • @Lundin 问题中指定了编译器,无论如何我都会编辑答案。
【解决方案2】:

你的编译器要么坏了,要么是一些非标准的废话,int 默认是无符号的。

我建议改用真正的、符合标准的 C 编译器。

【讨论】:

    【解决方案3】:

    检查编译器生成的汇编代码,你就知道了。或者在这里发布,这样我们就不必拥有/安装特定的编译器。组装的好想法(特别是在像 PIC16 这样的死的简单微机上)是它永远无法隐藏它的实际作用:-)

    我同意这里的一些 cmets 关于某些工具的质量,而且 Microchip 从来没有自己的 PIC16 C 编译器,所以我们不能责怪他们:-(

    【讨论】:

      猜你喜欢
      • 2021-11-09
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多