查看: 9625|回复: 7

[提问] 关于取得数组长度的问题

[复制链接]
发表于 2013-4-30 19:30:16 | 显示全部楼层 |阅读模式
关键词: 函数 , 数组长度
写了一个LCD12864显示的函数,是这样的:
void LCD12864_write(unsigned char address,unsigned char table_name[])
{
       unsigned char i;
       LCD12864_write_com(address);
       for(i=0;i<(sizeof(table_name)/sizeof(table_name[0]));i++)
       {
               LCD12864_write_dat(*table_name);
               table_name++;
       }
}
参数address是LCD12864的显示地址,table_name[]是要显示的数据的数组。但是sizeof(table_name)/sizeof(table_name[0]  这句不能得到实参数组的长度,这是为什么呢?
请大家指点一下。
发表于 2013-5-1 09:48:36 | 显示全部楼层
table_name[]

原型定义里边没确切给出数组长度,此时sizeof这个数组变量,意义何在?

sizeof是C的保留字,虽然看起来像是函数调用,实际并非函数调用,所以你函数中计算数组长度是在编译时就定下来的

而你行参中并未确切给出数组长度,所以这个在编译的时候编译器只能根据形参数组的起始地址到下一个结束符来作为其长度,而不是在函数调用时根据你实参的起始地址到结束符来作为其长度
发表于 2013-5-1 10:08:00 | 显示全部楼层
验证了一下,32位linux系统里边,gcc这种情况下是把这种不确定类型(长度不确定的数组)当作指针变量来处理了,而非上面所说从数组起始的地方到下一个结束符
发表于 2013-5-1 10:09:23 | 显示全部楼层
从起始到结束符的计算实际还是函数处理过程,这个是我有点想当然了,呵呵,sizeof在编译时是根据确切的数据类型来计算对象的长度的
 楼主| 发表于 2013-5-2 21:01:10 | 显示全部楼层
lelee007 发表于 2013-5-1 10:09
从起始到结束符的计算实际还是函数处理过程,这个是我有点想当然了,呵呵,sizeof在编译时是根据确切的数据 ...

但是就算是在函数定义时将形参unsigned char table_name[]的中括号中加入9(实参长度是9),也不能得到实参数组的长度,貌似也是得到的是指针变量的长度。这该怎么办?
发表于 2013-5-8 13:09:53 | 显示全部楼层
许多工程师在调试串口通信时都有过困惑,通信线路上跑的数据究竟对不对?如果通信的两端中的一端是电脑,还可以通过一些诸如“串口精灵”之类的软件来辅助,假如通信的两端都不是电脑,那就有点伤脑筋了。是不是?
现在,一款价廉物美的革命性的产品隆重亮相了。

串行数据分析仪套件(以下简称本产品)是本公司(无锡市恒运隆科技有限公司)开发的新一代串行数据采集和分析工具,由“串口数据采集器”和“串口数据分析助手”软件组成。该套件用来帮助工程师解决RS232和RS485的调试问题。和传统的“串口精灵”的纯软件工具不同,本产品有硬件和软件构成,并根据应用场合不同,使用不同的“串口数据采集器”。

该产品的显著特点如下:
•        使用硬件介入方式采集数据,保证数据的真实性  
•        使用硬件隔离技术保证数据采集丝毫不影响原来通信链路的正常通信和数据完整性
•        精确到微秒级的数据包硬件时标,保证时序关系的正确性
•        “串行数据分析助手”提供清新简洁的用户界面
•        具有简单易用的软件实时采集过滤功能
•        具有功能强大的离线数据检索和筛选功能
•        支持从300bps到115200bps波特率以及8位数据、奇偶校验或无校验
该产品适用的应用场合如下:
•        需要对RS232进行调试的场合  
•        需要对一般的RS485总线进行调试的场合
•        需要对PLC的RS485进行调试的场合

发表于 2013-6-27 21:45:09 | 显示全部楼层
今天想起这个问题来,呵呵,之前都忘了这个问题的关键点,今天无意中翻书看到这点才想起来

C语言里边数组做形参时,会退化成指针,这个是C规范规定,所有编译器都会这样来做

LZ的问题的原因就显而易见了
发表于 2013-7-26 08:51:36 | 显示全部楼层
楼上正解。
你这个函数有很多问题:
1、参数不要:unsigned char table_name[]  传,[] 和 * 是有区别的,不要养成这种习惯,一些细节上会出问题的。
2、sizof()只能识别你定义的那种数组,这样操作不行,如楼上所说。
3、LCD12864_write_dat(*table_name);
                table_name++;
你都指针++了,还sizeof(指针),每次都sizeof不一样的地址,你说会是多大的问题?就算可以计算出大小,恐怕也只有第一次能计算出来。
同时,你既然用了for循环,为什么不
LCD12864_write_dat(table_name[i]);
来访问呢?这样的访问才是最安全的,指针上的强制转换、加减操作一定要小心,指针访问也要小心,指针操作不小心的一个失误就会崩溃程序。养成个好习惯,不要没事就指针++。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表