Fortran Coder

标题: 32位编译器和64位编译器的区别是什么? [打印本页]

作者: Villain    时间: 2014-10-17 16:41
标题: 32位编译器和64位编译器的区别是什么?
小弟我在做一个网格的时候碰到的一件怪事。

从boss那边拿到的一个程序改的

大概是这样的

module common
(省略部分)
integer::II,JJ
(省略部分)
end module common

然后在主程序和自程序中都有 use common

但是在调用子程序的时候大概是这样:
call subAA(II,JJ,output)
write(*,*)II,JJ

在子程序中II,JJ都没有参与计算,只是作为循环的控制量,我用的是Microsoft visual fortran2008,但是用32位的ivf发现II经过了子程序后数值改变为0,而JJ并没有发生改变。而在同一台电脑上用64位的ivf编译则没有这种错误。
本人电脑是64位的,出现这种错误的原因到底是什么?在使用中该如何避免?
望各位大神指点。


作者: 楚香饭    时间: 2014-10-17 16:51
32位编译器得到32位目标代码(exe程序?)
64位编译器得到64位目标代码(exe程序?)

根据你的描述来看,与编译器无关。最好给出全部代码
作者: 珊瑚虫    时间: 2014-10-20 16:53
查一下你的II,JJ 在程序中有无重复定义的情况
作者: mangix2010    时间: 2014-10-22 04:07
这个跟32位,64位没关系吧
作者: Villain    时间: 2014-10-22 08:34
珊瑚虫 发表于 2014-10-20 16:53
查一下你的II,JJ 在程序中有无重复定义的情况

确定没有,语句上也应该没问题。
作者: Villain    时间: 2014-10-22 08:39
mangix2010 发表于 2014-10-22 04:07
这个跟32位,64位没关系吧

用Ifort编译,调用
C:\Program Files (x86)\Intel\Compiler\11.1\054\bin\ia32\ifortvars_ia32.bat
来编译的时候出错,但是调用
C:\Program Files (x86)\Intel\Compiler\11.1\054\bin\intel64\ifortvars_intel64.bat
的时候结果是对的。
debug的时候发现问题是出现在调用子程序向其传递值形参的时候出错。


作者: jason388    时间: 2014-10-23 16:34
1. 仔细检查你的那两个批处理文件,看看是否有什么特殊的选项。
2. 把子程序改成显示接口,这样如果参数匹配有问题编译器可以发现。
3. 检查子程序中的中间运行结果,看看问题出在什么地方,循环变量在运行中是变的,所以只能在跟踪后才能下结论。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2