源文件包含的一个函数太大

[复制链接]
2785|8
 楼主| wangjun0415 发表于 2012-11-12 17:58 | 显示全部楼层 |阅读模式
程序中出现以下错误
   C51 FATAL-ERROR -
        ACTION: GENERATING INTERMEDIATE CODE
        ERROR:  FUNCTION '_DesExeEncrypt' (LINE 616, T=400, L=98, l=1): TOO COMPLEX C51 TERMINATED.

在LINE 616处是一个宏(比较长,功能类似于一个函数,由于涉及到比较多的变量,所以不方便写成函数的形式)。如果将函数DesExeEncrypt(DES运算,宏扩展之后整个函数比较大)里面某些语句,如将
for(i=0; i<4; i++)
{
  DesChangeAreaIn[4+i] = desDatL[i];
}
改为
for(i=0; i<4; i++) DesChangeAreaIn[4+i] = desDatL[i];
就不会出错,删除其他可以删除的类似括号或者如上将程序写在一行上,程序就完全正常。
请问出现这种错误的原因一般是什么?是编译器的底层程序的Bug还是C51的一些值的限制(如“函数类型段总和最多255个”或者“语句行和宏定义行最多510个字符”这类原因是什么意思?和这里可能有关系吗?)错误中的T=400, L=98, l=1是什么意思,请问对程序调试有什么作用吗?

是个新手,有些信息可能提供得还不够,如有需要,请说明一下。
期望各位的解答,谢谢!
 楼主| wangjun0415 发表于 2012-11-12 18:13 | 显示全部楼层
还有个信息没在上面提到,不好意思。
在C51编译器中文手册中对于GENERATING INTERMEDIATE CODE是这样解释的:源文件包含的一个函数太大,不能被编译器编译成虚拟代码。尝试把函数分小或重新编译。
但是个人觉得我上面的代码并没有改变真实的代码量呀。
ayb_ice 发表于 2012-11-13 08:15 | 显示全部楼层
请看下面例子,多行的必须写成这样子
#define my_macro()\
{\
...\
...\
}
 楼主| wangjun0415 发表于 2012-11-13 08:54 | 显示全部楼层
3# ayb_ice

是写成这样的了,而且稍微减少几行的话,程序是可以运行的,感觉函数超过了一定的行数,或者里面的{}太多的话就会出错。谢谢你了!
ayb_ice 发表于 2012-11-13 09:06 | 显示全部楼层
本帖最后由 ayb_ice 于 2012-11-13 09:08 编辑

C51里宏好象确有一些限制,宏的总长度好象不能超过1千多个字符的

本帖子中包含更多资源

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

×
 楼主| wangjun0415 发表于 2012-11-13 09:40 | 显示全部楼层
5# ayb_ice

嗯,确实有限制,但是我觉得我改变其他的函数语句应该对于宏没有影响的吧?宏的总字符数并不会因为其他函数语句的长短而改变呀,但却出现了其他语句多了却报宏的错的问题,是不是对于整个函数的行数也有一定的限制?谢谢!
ayb_ice 发表于 2012-11-13 09:54 | 显示全部楼层
这个最大字符限制好象是宏展开后的字符数
 楼主| wangjun0415 发表于 2012-11-13 10:24 | 显示全部楼层
7# ayb_ice
嗯,这个我知道,但是函数中其他的语句会影响到宏展开的字符吗?这个最大限制是对于宏展开的限制,没有提到对函数的限制,对于宏,对于我在上面描述的两种情形(一种可以运行程序,一种出错),我并没有改变过宏的具体内容呀。
 楼主| wangjun0415 发表于 2012-11-21 11:18 | 显示全部楼层
还是没有找到问题出现的原因,还是结帖吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

12

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部