Fortran Coder

查看: 13027|回复: 6
打印 上一主题 下一主题

[编译器] 32位编译器和64位编译器的区别是什么?

[复制链接]

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
跳转到指定楼层
楼主
发表于 2014-10-17 16:41:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟我在做一个网格的时候碰到的一件怪事。

从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位的,出现这种错误的原因到底是什么?在使用中该如何避免?
望各位大神指点。

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

737

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
705 元
贡献
361 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2014-10-17 16:51:10 | 只看该作者
32位编译器得到32位目标代码(exe程序?)
64位编译器得到64位目标代码(exe程序?)

根据你的描述来看,与编译器无关。最好给出全部代码

135

帖子

15

主题

0

精华

版主

F 币
1159 元
贡献
637 点

爱心勋章管理勋章

板凳
发表于 2014-10-20 16:53:46 | 只看该作者
查一下你的II,JJ 在程序中有无重复定义的情况

35

帖子

2

主题

1

精华

专家

超子

F 币
565 元
贡献
196 点

规矩勋章

QQ
地板
发表于 2014-10-22 04:07:10 | 只看该作者
这个跟32位,64位没关系吧

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
5#
 楼主| 发表于 2014-10-22 08:34:15 | 只看该作者
珊瑚虫 发表于 2014-10-20 16:53
查一下你的II,JJ 在程序中有无重复定义的情况

确定没有,语句上也应该没问题。

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
6#
 楼主| 发表于 2014-10-22 08:39:31 | 只看该作者
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的时候发现问题是出现在调用子程序向其传递值形参的时候出错。

69

帖子

7

主题

0

精华

专家

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

评分

参与人数 1F 币 +9 贡献 +9 收起 理由
fcode + 9 + 9

查看全部评分

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

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-25 11:04

Powered by Tencent X3.4

© 2013-2024 Tencent

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