为什么这个条件总是为真?

问题描述 投票:0回答:5

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

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

#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倒计时项目,所以: 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 embedded microcontroller pic
5个回答
5
投票

使用

    signed int i;

代替

    int i;

整数在 CCS 编译器中默认是无符号的。

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

查看第 38 页

“默认情况下,除 float 之外的所有类型都是无符号的;但是,[它们]前面可能有无符号或有符号。


0
投票

你的编译器要么坏了,要么是一些非标准的垃圾,其中

int
默认是无符号的。

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


0
投票

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

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


0
投票

我只是弄清楚它与for条件有关并且 递减 for.

上的变量类型

*使用变量类型作为 signed int8 或 signed int16,

*停止条件设为 i>-1;

这消除了警告并且代码运行正常。

...
#include <16f84a.h>
#fuses XT, NOWDT
#use delay(clock=4000000)

void main(){
    set_tris_b(0x00);
    output_b(0x00);
    signed int16 i, unid, dec, dato;
    while(true){
        for(i=99; i>-1; i--){
            dec = i/10;
            unid = i - (dec*10);
            dato = (dec<<4) + unid;
            output_b((int8)dato);
            delay_ms(50);
       }
   }
}
...

-1
投票

以下代码的类似问题,图片在第一轮运行正常, 但是当它再次启动时它显示其他值,这发生了 当我看到同样的警告时,我不知道我需要修改什么 在防止此类警告的代码中,请帮助

#include <16f84a.h>
#fuses XT, NOWDT
#use delay(clock=4000000)

void main(){
    set_tris_b(0x00);
    unsigned int i, unid, dec, dato;
    while(TRUE){
        for(i=99; i>=0; i--){
            dec = i/10;
            unid = i - (dec*10);
            dato = (dec<<4) + unid;
            output_b(dato);
            delay_ms(50);
       }
   }
}

© www.soinside.com 2019 - 2024. All rights reserved.