数码之家

 找回密码
 立即注册
搜索
查看: 1593|回复: 28

请教一个C51程序中的变量的取值范围问题【已解决】

[复制链接]
发表于 2022-1-26 16:11:19 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 慕名而来 于 2022-2-2 15:27 编辑

问题已经解决,详见28楼回帖。
请教各位一个如题的问题!我在函数中用unsigned char设了一个无符号变量i,我知道i的取值范围是0-0xff也就是0-255,程序需要进行如下循环判断:for(i=0;i<256;i++),我实际应用时没发现问题,但我不知道这样使用这个变量是否有超范围判断的问题,请大家指点一下。
发表于 2022-1-26 16:30:29 | 显示全部楼层
初始值是0,判断条件是是否小于256,自增

感觉没有问题
回复 支持 反对

使用道具 举报

发表于 2022-1-26 16:35:12 | 显示全部楼层
本帖最后由 简燕 于 2022-1-26 16:37 编辑

肯定有问题. C语言下,usigned char i; i<256 永远是真.  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-26 16:45:17 | 显示全部楼层
hushao 发表于 2022-1-26 16:30
初始值是0,判断条件是是否小于256,自增

感觉没有问题

我正在修改代码,感觉会有问题的,我感觉不进行255与256的比对,他可能会停不下来,而比对之前必要做加1运算,而i=255后再加1就会变成0了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-26 16:50:20 | 显示全部楼层
简燕 发表于 2022-1-26 16:35
肯定有问题. C语言下,usigned char i; i

请教!我的这个i即作为计数变量也作为传递参数使用,如果在这个函数里将其设定为uint类型时经过其他函数的运算后结果就是错误的,不知道有没有其他的变通的方法
回复 支持 反对

使用道具 举报

发表于 2022-1-26 16:54:13 | 显示全部楼层
这个循环不会停止, 当i=255以后再自加就变成0了.我遇到过这样的问题.
回复 支持 反对

使用道具 举报

发表于 2022-1-26 16:55:51 | 显示全部楼层
也许你的编译系统在比较时加了强类型变换. 不然这是个死循环.
回复 支持 反对

使用道具 举报

发表于 2022-1-26 16:57:13 | 显示全部楼层
慕名而来 发表于 2022-1-26 16:50
请教!我的这个i即作为计数变量也作为传递参数使用,如果在这个函数里将其设定为uint类型时经过其他函数 ...

上代码,不然不好说.
我现在按你说的猜测,问题是变量作用域问题,不管是函数参数还是函数内的变量都是局部变量,在函数内部改变这些变量是不会影响实参的.
回复 支持 反对

使用道具 举报

发表于 2022-1-26 17:06:29 | 显示全部楼层
慕名而来 发表于 2022-1-26 16:50
请教!我的这个i即作为计数变量也作为传递参数使用,如果在这个函数里将其设定为uint类型时经过其他函数 ...

如果待传递的参数值大于255,被调用的函数也不可能用usigned char  参数类型.
回复 支持 反对

使用道具 举报

发表于 2022-1-26 17:23:30 | 显示全部楼层
For循环正常运行,结束之后,i应该是257,然后跳出循环。
你这个应该无法跳出循环。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-26 17:25:12 | 显示全部楼层
简燕 发表于 2022-1-26 17:06
如果待传递的参数值大于255,被调用的函数也不可能用usigned char  参数类型.

我详细说下,如果有时间请帮忙看看。
我在玩一个VFD屏,已经根据坛友分享的数据正常点亮了屏幕,现在开始做几个底层函数的调试,下面是一个写(显示)8位数据的函数,已经调试成功了,代码如下:

  1. void Write_8bit(uint x,uchar y,uchar dat)
  2. {
  3.    y=y*8;
  4.     VFD_CS=0;

  5.     SPI_WriteByte(0xF0);
  6.     SPI_WriteByte(x);
  7.     SPI_WriteByte(y_offset+y);
  8.         SPI_WriteByte(y_offset+y+8); //数据长度8bit

  9.         SPI_WriteByte(dat);

  10.     VFD_CS=1;
  11.   
  12. }
复制代码


这个函数中的x为0-255,y为0-6;接下来就是编写调试清屏函数:

  1. void VFD_Clear(uchar color)
  2. {
  3. uchar i,j;
  4. //uint i;
  5. for (i = 0; i < 256; i++)
  6.     {
  7.              for (j = 0; j < 7; j++)
  8.             {
  9.                         Write_8bit(i,j,color);
  10.             }
  11.         }
  12. }
复制代码


到了这里就出现问题了,如果i是uchar就正常的全屏显示了,如果i是uint则只在屏幕右侧边缘显示一条竖线,弄了好久没弄懂才来提问的,请帮忙指点一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-26 17:28:51 | 显示全部楼层
fryefryefrye 发表于 2022-1-26 17:23
For循环正常运行,结束之后,i应该是257,然后跳出循环。
你这个应该无法跳出循环。 ...

我的理解是应该在小于256时执行后再判断而等于256时就不执行了而后跳出循环吗。我在后边贴了代码请帮忙看看,先谢了。
回复 支持 反对

使用道具 举报

发表于 2022-1-26 17:32:58 | 显示全部楼层
慕名而来 发表于 2022-1-26 17:25
我详细说下,如果有时间请帮忙看看。
我在玩一个VFD屏,已经根据坛友分享的数据正常点亮了屏幕,现在开始 ...

void VFD_Clear(uchar color)
{
uint i, j;
for (i = 0; i < 256; i++)
    {
             for (j = 0; j < 7; j++)
            {
                        Write_8bit((uchar)i,(uchar)j,color);
            }
        }
}

这样就可以了
回复 支持 反对

使用道具 举报

发表于 2022-1-26 20:42:38 | 显示全部楼层
改成do-while试试看。
  1. void VFD_Clear(uchar color)
  2. {
  3.     uchar i,j;
  4.     //uint i;

  5.     i=0;
  6.     do
  7.         {
  8.                      for (j = 0; j < 7; j++)
  9.                     {
  10.                                       Write_8bit(i,j,color);
  11.                     }
  12.             }while(++i);
  13. }
复制代码




回复 支持 反对

使用道具 举报

发表于 2022-1-26 21:33:51 | 显示全部楼层
慕名而来 发表于 2022-1-26 17:28
我的理解是应该在小于256时执行后再判断而等于256时就不执行了而后跳出循环吗。我在后边贴了代码请帮忙看 ...

我之前说错了,是256。
你说的没错,就是加到256,判断不符合,跳出循环。
回复 支持 反对

使用道具 举报

发表于 2022-1-26 23:31:24 来自手机浏览器 | 显示全部楼层
for循环是先判断条件再执行,char不可能等于或大于256,死循环。
下面结构可以先执行再判断,判断i<255就行了。
do
其他代码
i++
while(条件)
回复 支持 反对

使用道具 举报

发表于 2022-1-26 23:32:05 | 显示全部楼层
慕名而来 发表于 2022-1-26 17:25
我详细说下,如果有时间请帮忙看看。
我在玩一个VFD屏,已经根据坛友分享的数据正常点亮了屏幕,现在开始 ...

void VFD_Clear(uchar color)
{
uchar i,j;
//uint i;
for (i = 0; i < 256; i++)
    {
             for (j = 0; j < 7; j++)
            {
                        Write_8bit(i,j,color);
            }
if (255 == i)  break;
        }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-27 09:36:29 | 显示全部楼层
非常感谢楼上几位坛友的参与以及耐心指点,现在来看我原来的循环判断肯定是有问题的,也正是因为问题的存在出现了死循环才点亮了整个屏幕,第一次接触VFD屏,我正在做各种实验与调试,有了结果再来回帖。
回复 支持 反对

使用道具 举报

发表于 2022-1-28 10:41:40 | 显示全部楼层
定义成int型变量可否
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-28 15:52:33 | 显示全部楼层
aqxgm 发表于 2022-1-28 10:41
定义成int型变量可否

目前涉及很多奇怪问题还没有理清,估计不仅是变量类型问题了,这个屏的例程是用STM32F103的,用103C8T6验证也可以实现正常显示,问题主要出现在用STC12LE5A60S2的驱动上,虽然硬件SPI或模拟SPI都可以刷屏但是也只能在同一个C函数里操作正常,如果将SPI函数做到其他C模块里再调用到主函数中就不能正常使用了,我没碰到过这种情况也实在搞不明白的,这个VFD屏的驱动芯片太迷糊了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-3 11:50 , Processed in 0.748801 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表