LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1034|回复: 10

问: 这是gcc(g++)的bug ?

[复制链接]
发表于 2005-2-18 18:31:30 | 显示全部楼层 |阅读模式
下面这个程序,我在vc里面编译,执行结果是正确的,而用g++编译运行就错误,1.3.1和1.3.5都错误,而且错的不一样

//to check if the x belongs to array a
//this program compiles well using MSVC, however mistaken using gcc 1.3.1 and 1.3.5
#include <iostream>
using namespace std;

template<class T>
bool belongto(T list[],int i,int n,T x)
{
        if(i==n)
        {
                return false;
        }
        else
        {
                if(x==list)
                        return true;
                else
                        belongto(list,i+1,n,x);
        }
}

int main()
{
        char a[]={'h','e','l','l','o'};
        if(belongto(a,0,5,'w'))
                cout<<"char 'w' belongs to \"hello\""<<endl;

        if(belongto(a,0,5,'e'))
                cout<<"char 'o' belogs to \"hello\""<<endl;
        return 0;
}
发表于 2005-2-19 08:16:16 | 显示全部楼层
没有问题,用g++编译。gcc在编译c++程序时不会自动链接c++标准库文件。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-19 12:23:47 | 显示全部楼层
请教斑竹的g++版本,还有编译的方法,谢谢
回复 支持 反对

使用道具 举报

发表于 2005-2-20 02:22:38 | 显示全部楼层
就是g++ file.cpp就可以了。现在的g++的版本都应该可以正常编译的。
把你的错误信息贴上来看看,我搞不清楚你具体碰到了什么问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-21 11:46:12 | 显示全部楼层
# g++ t.cpp    (no error message)
# ./a.out          (no output)

# g++ -v
Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.5/specs
Configured with: ../src/configure -v --enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared --with-system-zlib --enable-nls --without-included-gettext --enable-__cxa_atexit --enable-clocale=gnu --enable-debug --enable-java-gc=boehm --enable-java-awt=xlib --enable-objc-gc i486-linux
Thread model: posix
gcc version 3.3.5 (Debian 1:3.3.5-8)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-21 12:17:18 | 显示全部楼层
以上是在debian里编译执行的结果,没有输出

下面是在即时linux ( thiz linux 7.0 ) 里编译执行的结果, (结果是错误的!!!), 和g++的版本号

[zh@localhost tmp]$ ./a.out
char 'w' belongs to "hello"
char 'o' belogs to "hello"

[zh@localhost tmp]$ g++ -v
Reading specs from /usr/lib/gcc-lib/i586-thiz-linux/3.3.1/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i586-thiz-linux
Thread model: posix
gcc version 3.3.1 20030915 (ThizLinux 3.3.1-5Thiz)
回复 支持 反对

使用道具 举报

发表于 2005-2-21 12:37:52 | 显示全部楼层
别郁闷了,肯定是你自己的程序写得有问题。
我给你修改了一下:

  1. #include <iostream>
  2. using namespace std;

  3. template < class T > bool belongto(T list[], int i, int n, T x)
  4. {
  5.     static bool temp = false;
  6.     if (i == n) {
  7.         return false;
  8.     } else {
  9.         if (x == list[i])
  10.             temp = true;       
  11.         else
  12.             belongto(list, i + 1, n, x);
  13.     }
  14.     return temp;
  15. }

  16. int main()
  17. {
  18.     char a[] = { 'h', 'e', 'l', 'l', 'o' };
  19.     if (belongto(a, 0, 5, 'w'))
  20.         cout << "char 'w' belongs to "hello"" << endl;

  21.     if (belongto(a, 0, 5, 'e'))
  22.         cout << "char 'o' belogs to "hello"" << endl;
  23.     return 0;
  24. }
复制代码

因为C++中的函数只能向直接调用者返回值,从多层递归调用的函数中直接向main函数返回值是行不通的,可以借助一个静态变量来保存返回值。
回复 支持 反对

使用道具 举报

发表于 2005-2-21 15:31:14 | 显示全部楼层
改成
else
return belongto(list,i+1,n,x);
试试。
回复 支持 反对

使用道具 举报

发表于 2005-2-21 17:36:02 | 显示全部楼层

这是最简单的改法。

Post by efan
改成
else
return belongto(list,i+1,n,x);
试试。


也完全附合递归的意图,即最里层的返回值必须返回到最外层。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-21 17:57:54 | 显示全部楼层
多谢各位的修改!

我要仔细研究它们。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表