超奇怪的switch case语句中的错误!!!!

hxfhxf 2005-06-29 09:23:50
switch(flag) //flag 为int
{
case 1:
if...
else...
....
break;
case 2:
if...
else...
....
break;
..............
case n:
if...
else...
....
break;
default: break;

}

前面一直没报错,当n=20的时候,出现一个和数量有关的错误,错误代码为:
compiler limit: too many exception handler states in function 'OnOk'.simplify fuction.
我查了msdn,确信case语句的n可以为任意不相同的数,没有数量限制.我的每个case语句中都为20几条if-else语句组成,难道case语句和if-else组合的时候会有数量限制.另外申明程序代码应该没错,因为n=19以前都是对的,到了20时报错,并且如果这时把case=19或者case=其他n那段注释掉,则程序不报错.好奇怪,已经困扰我几天了,求大人门帮助!!!!
...全文
1144 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxfhxf 2005-07-11
  • 打赏
  • 举报
回复
谢谢大家
hxfhxf 2005-06-30
  • 打赏
  • 举报
回复
刚测试了一下,把case 20 以后的代码放到switch外部,程序仍报原来的错误,这样说,switch语句本身并没有什么数量上的特别限制,而是函数本身(onok)有数量限制,难道大家平时写过的函数没有遇到过长代码的问题,有的函数不是听说有几千条语句么?有谁知道这方面的具体知识,说来让大家学学,是函数内部有数量的限制么?这个限制说明在哪里可以找到?
回复 ljp3000(LJP.net) ,我的问题应该和正版倒版没有关系,重起包括换机器都不要想,因为已经调了两天了,机器都开机关机多少次了........
kofiory 2005-06-30
  • 打赏
  • 举报
回复
没碰到过,期待解决!
Phourm 2005-06-30
  • 打赏
  • 举报
回复
Possible solutions:
Simplify expressions within function by grouping common subexpressions and assigning them to temporary variables.
Break the function into two or more functions containing fewer lines.
oyljerry 2005-06-30
  • 打赏
  • 举报
回复
嗯,好问题,收藏
hxfhxf 2005-06-30
  • 打赏
  • 举报
回复
谢谢大家,早上后来就绕道解决了问题,现在简单整理一下,提供给大家,谢谢所有关心的朋友。解决方法:在类中添加public函数void fuction1(),把case中的语句段写在函数fuction1()中,然后在case中调用函数。如msdn上所说,切割以后的小函数因为在onok()的外部,所以程序调试通过。综合起来说,一个函数中的变量(或者指针)在某些方面因为某种原因是有数量限制的,超出这个数量范围程序就编译不了,至于更加具体的解释原因,希望高手能出来指点一下,让我们有所长进。此帖继续讨论,过两天再结帖,谢谢大家!
一条晚起的虫 2005-06-30
  • 打赏
  • 举报
回复
把case里的重复代码做成函数放到OnOK()外面
handwolf 2005-06-30
  • 打赏
  • 举报
回复
如果可以,把工程发给我,改后发给你!

handwolf@126.com
hxfhxf 2005-06-30
  • 打赏
  • 举报
回复
早上来看,还是没有答案,大家酒救我
powerlly 2005-06-30
  • 打赏
  • 举报
回复
可不可以另外写一个函数
在OnOK() 中调用它
walkersun 2005-06-29
  • 打赏
  • 举报
回复
The code exceeds an internal limit起码说明代码超过了内部限制,你把每个case里面的代码做成小函数,试试。
hxfhxf 2005-06-29
  • 打赏
  • 举报
回复
The code exceeds an internal limit on exception handler states (1,920 states)中的(1,920 states)范围是针对switch语句,还是我的指针啊?我程序基本必须采用switch结构,而且case的n很多,大概为40个值,每个case中的语句也很多,我的代码是写在按钮的onok中,我怎么分割啊,msdn的意思是我必须要分割到switch外面,还是在某个变量要分割,或者要分割到onok外面?谁能说清楚一点啊?
ljp3000 2005-06-29
  • 打赏
  • 举报
回复
如果你确信代码没有问题,且不想改代码,呵
那就重启VC,看能不能解决问题,
不行再重启windows, 再不行依次打VC补丁, 重装VC, 重装windows,....

最后一招买正版的VC,打电话叫客服,呵


walkersun 2005-06-29
  • 打赏
  • 举报
回复
也许是switch不能包含数量太多的语句。你测试一下。
hxfhxf 2005-06-29
  • 打赏
  • 举报
回复
再次申明,代码一定没问题,因为如前文所说,我的一个case对应一个表,也就是说,后面的case中的代码,都是copy前面第一个case语句段,然后修改其中的表的具体字段名而已,既然前面一直没问题,说明代码没有问题。而且是n=20时出现问题,但只要把n=19或者n=3(或者其他)case段注释掉,则程序不报错,说明case 20 段没有错误。还有,例如把n=19或者n=3(或者其他)的case语段中注释掉任意一句,则报错的位置后移一句,这些都说明是数量的限制。
我也在写测试程序来找具体原因,但是帖出来希望高手能指出问题的关键所在,最好是有官方的依据,我用的是vc++6.0
walkersun 2005-06-29
  • 打赏
  • 举报
回复
MSDN说得很清楚啊:The function contains a complex expression of user-defined class variables and arithmetic operators. 所以,你要simplify function:Simplify expressions by assigning common subexpressions to temporary variables. Split the function into smaller functions.

handwolf 2005-06-29
  • 打赏
  • 举报
回复
Split the function into smaller functions.

把函数分解成多个小函数
hxfhxf 2005-06-29
  • 打赏
  • 举报
回复
错误代码和 xing_xing_xing(未名) 指出的完全一样。 Fatal Error C1509:
compiler limit : too many exception handler states in function 'onok'. simplify function
看来就是这个问题了,哪位能结合我的情况(如上文交代),对应msdn的方案,给我一个解释,帮助我找到问题根源。。。。。。。
heavenchang 2005-06-29
  • 打赏
  • 举报
回复
要怀疑是不是有限制还不简单:
写个空的试一下!

我这边试过了,没有有问题 vc6 +sp6 and Microsoft Visual Studio .NET 2003
hxfhxf 2005-06-29
  • 打赏
  • 举报
回复
我刚试了,把所有的if-else语句改写成只保留else后的那句(精简一下),发现还是数量问题。我把问题背景交代一下。我是用ado访问access数据库,这里是用一个case对应一个表,我在每个case中都用到了_RecordsetPtr m_RecordSet指针,然后都是类似
m_RecordSet->Fields->GetItem("字段名")->Value语句,一个字段一句,可想而知每个case中该语句较多。另外,我的表多,前面20个以前都没有问题,现在到了20,这个数量问题出现了,我不知是case语句对数量有限制(可msdn中说没有限制),还是我的_RecordsetPtr m_RecordSet指针有数量限制。申明一下,我在每个case的开头对m_RecordSet进行实例化,在case结尾前都m_RecordSet->Close();并且每个case都严格有break语句,整个switch语句有deafault语句。到底是switch的限制,还是_RecordsetPtr m_RecordSet指针的问题呢?
加载更多回复(11)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧