LinuxSir.cn,穿越时空的Linuxsir!

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

请问几个gcc,g++问题

[复制链接]
发表于 2003-5-27 13:01:31 | 显示全部楼层 |阅读模式
我想将windows下的程序改写到linux下。但我刚用gcc,g++,emacs不久,还不很熟悉,有几个问题想请教一下,请各位指点:
1。gcc编译*.c文件时有时会找不到库函数,但用g++编译*.cpp确正常。缘由是文件中用了math.h库中的sin()函数,gcc编译*.c文件时会提示未定义的函数sin();(我指定目录#include"/usr/include/math.h"也不行).何解?我的程序都是用c写的。我不想轻易就用c++的编译器来编译c程序。
2。用gcc编译.c文件不能数组申请,提示非定长数组和太长,但我用g++编*.cpp可以。已知我的数组是定长的阿,且为double型32个。
3。优化编译的参数是什么?我只想从运行速度考虑,而不考虑目标大小?还请各位仔细讲一下。man太多了,看累得慌。
4。borland c++5.02下有__int64 扩展类型,不知linux下有没有?有的话是什么?
已知我用的是suse82,编译器是完全安装的。
5。小问题:windows下的文本文件到linux下每一行都加了个^M,虽说无伤大雅,但看这很不舒服,有没有办法消除?emacs的缩进能不能改成3个字符,如何改?

不好意思一下就问了这么多问题,如果谁知道,请指点!我先谢过了!
发表于 2003-5-27 13:43:00 | 显示全部楼层
1、编译的时候加上 -lm就可以编译math函数了,这里m代表libm.so
2、这个可能是编译器的问题,你用gcc的时候是不是加上 -ansi了?
3、优化开关好像是-m然后后面跟一个数字,但是具体的效果我不清楚,你可以到永远的UNIX去看看。
4、这个我不知道
5、这是因为DOS下的ASCII文本的行结束是由两个符号表示的,也就是回车和换行。它们的16进制是0x0D 0x0A,而UNIX系统下的ASCII文本的行结束是0x0A,这就造成问题了。
6、至于缩进嘛,嘻嘻,看在你常来SuSE的份上,我就告诉你吧。修改你自己的目录下的.gnu-emacs,把第308和309这两行里面的4改成你需要的缩进宽度就可以了。.gnu-emacs这个文件初始状态好像是只读的,你需要修改一下它的权限。这个办法只适用于SuSE哦,不过看看那几句lisp语句应该能猜到它干了什么吧。
发表于 2003-5-27 14:13:40 | 显示全部楼层
2.这个问题不清楚,我没遇到过,你是怎么声明的?
3.-On 大写的欧后跟优化级别0~3|s
4.long long int
发表于 2003-5-27 14:14:19 | 显示全部楼层
 楼主| 发表于 2003-5-27 16:40:09 | 显示全部楼层
3X first!
but the second problem,.....
to libinary:
i define like these lines below:
int const NTAB=32;
static long iv[NTAB];

the error output is:
ctext/langevin> gcc -lm mean-ca-n.c
mean-ca-n.c: In function `ran1':
mean-ca-n.c:149: error: storage size of `iv' isn't constant
mean-ca-n.c:149: error: size of variable `iv' is too large
mean-ca-n.c: In function `ran2':
mean-ca-n.c:193: error: storage size of `iv' isn't constant
mean-ca-n.c:193: error: size of variable `iv' is too large

Why?
thanks firs
发表于 2003-5-27 17:15:55 | 显示全部楼层
最好把有问题的程序贴出来。贴代码时要注意按置顶贴子的要求做,以保持缩进。
 楼主| 发表于 2003-5-27 18:50:46 | 显示全部楼层
#define IA 16807
#define IM 2147483647
#define AM (1.0/IM)
#define IQ 127773
#define IR 2836
#define NTAB 32
#define NDIV (1+(IM-1)/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
float ran1(long *idum)
//period 10e8
{
int j;
long k;
static long iy=0;
static long iv[NTAB];
float temp;
if (*idum <= 0 || !iy)
{
if (-(*idum) < 1) *idum=1;
else *idum = -(*idum);
for (j=NTAB+7;j>=0;j--)
{
k=(*idum)/IQ;
*idum=IA*(*idum-k*IQ)-IR*k;
if (*idum < 0) *idum += IM;
if (j < NTAB) iv[j] = *idum;
}
iy=iv[0];
}
k=(*idum)/IQ;
*idum=IA*(*idum-k*IQ)-IR*k;
if (*idum < 0) *idum += IM;
j=iy/NDIV;
iy=iv[j];
iv[j] = *idum;
if ((temp=AM*iy) > RNMX) return RNMX;
else return temp;
}

原程序太长。这是子程序,问题就出在这。这是一个随机数产生程序。此程序在windows编译没问题。
注意:我只想用gcc编译,不是g++!
发表于 2003-5-27 18:52:34 | 显示全部楼层
确实不行,因为vi是static变量,它的被分配和初始化比NTAB要早,所以就出现了错误,而C++的处理方式和C不一样,如果确定一个const变量的值的话,C++一般就会直接使用,而不为变量分配空间,这时候变量就象C里的宏,所以没有问题。
解决这个问题可以用:
1.不用static,我不知道你为什么要用static,你是在函数里还是在全局空间里声明的变量?你是为了什么目的用static呢?
2.用宏,为了不污染其他的空间,可以用#define..#undef..把你要使用NTAB的代码包起来。
发表于 2003-5-27 18:55:20 | 显示全部楼层
没看见你后面的帖,你贴的程序用#define NTAB 32就应该没问题呀。
 楼主| 发表于 2003-5-27 19:16:06 | 显示全部楼层
ok! I see.
thanks very much!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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