打印

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

[复制链接]
2111|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
程序中出现以下错误
   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

是写成这样的了,而且稍微减少几行的话,程序是可以运行的,感觉函数超过了一定的行数,或者里面的{}太多的话就会出错。谢谢你了!

使用特权

评论回复
5
ayb_ice| | 2012-11-13 09:06 | 只看该作者
本帖最后由 ayb_ice 于 2012-11-13 09:08 编辑

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

未命名.JPG (110.23 KB )

未命名.JPG

使用特权

评论回复
6
wangjun0415|  楼主 | 2012-11-13 09:40 | 只看该作者
5# ayb_ice

嗯,确实有限制,但是我觉得我改变其他的函数语句应该对于宏没有影响的吧?宏的总字符数并不会因为其他函数语句的长短而改变呀,但却出现了其他语句多了却报宏的错的问题,是不是对于整个函数的行数也有一定的限制?谢谢!

使用特权

评论回复
7
ayb_ice| | 2012-11-13 09:54 | 只看该作者
这个最大字符限制好象是宏展开后的字符数

使用特权

评论回复
8
wangjun0415|  楼主 | 2012-11-13 10:24 | 只看该作者
7# ayb_ice
嗯,这个我知道,但是函数中其他的语句会影响到宏展开的字符吗?这个最大限制是对于宏展开的限制,没有提到对函数的限制,对于宏,对于我在上面描述的两种情形(一种可以运行程序,一种出错),我并没有改变过宏的具体内容呀。

使用特权

评论回复
9
wangjun0415|  楼主 | 2012-11-21 11:18 | 只看该作者
还是没有找到问题出现的原因,还是结帖吧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

12

帖子

0

粉丝