语言陷阱:armcc的Fatal error:0x0ce4

不要问我为什么,反正它就是发生了,我不能保证你的问题和我的情况一样。

今天编译的时候,出现了下列的错误:

Fatal error: Internal fault: 0x0ce4 in ‘xxxx’

xxxx为函数名,如果你在错误上点了的话,会跳转到程序的结尾,反正不在那个函数上(我用emacs,编译出错可以直接跳转岛错误的地方)。根据常识,这又是个不明的错误。我的代码结构大致如下:

       class A
       {
       public:
       void drawsubString(const String& str, int num, int x, int y)
       {
       drawStringAll(str.subString(0, num), x, y);
       }
       void drawStringAll(const char* str, int x, int y)
        {
        //描绘文字操作
        }
        void drawText(const char* text[], int x, int y, int text_length)
         {
         for(int i = 0; i < text_length; i++) {
         drawsubString(text[i], 10, x, y); //这里的10的参数为随意写的,真实的是变量。
         }
         }
       };
       

上述代码貌似没有什么问题,String类为我自己做的,也基本上没有什么问题的,支持从const char*到String的转换,以及String岛const char*的转换,均无任何问题,String::subString的实现如下:

       class String
       {
       public:
       //这里简化操作,原始程序使用模板实现。
       String& subString(int offset, int length) const
       {
       }
       };
       

按道理来说,应该没问题,即使出现模糊的含义,编译器也应该提示的,但结果上述的操作就会直接的报告类似这样的错误:

Fatal error: Internal fault: 0x0ce4 in 'A::drawsubString'

目前的提示应该是上述的,但也有可能提示在函数 'A::drawText'

对于这一问题,我不知道是何原因,VS.net的编译器应该没有问题,gcc for arm的编译器我没有测试过,不清楚。现在唯一的修改办法是这样的:

       class A
       {
       public:
       void drawsubString(const String& str, int num, int x, int y)
       {
       //添加一个临时变量
       String temp = str.subString(0, num);
       drawStringAll(temp, x, y);
       }
       void drawStringAll(const char* str, int x, int y)
        {
        //描绘文字操作
        }
        void drawText(const char* text[], int x, int y, int text_length)
         {
         for(int i = 0; i < text_length; i++) {
         drawsubString(text[i], 10, x, y); //这里的10的参数为随意写的,真实的是变量。
         }
         }
       };
       

也有可能是我对c++规范的理解还不够深刻,真的希望有一天可以安心的看下规范。

另外,昨天提到的ubuntu的那个gave up的问题,结果出来了,还是不可以。看来还得接着找答案。我用的是btrfs分区,其他分区格式会不会好些呢?但之前的fedora就从来没有碰到这样的问题。

发布者

rix

如果连自己都不爱自己,哪还有谁来爱你