Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran-将程序从32位机器重新编译到64位机器_Fortran_Gfortran - Fatal编程技术网

Fortran-将程序从32位机器重新编译到64位机器

Fortran-将程序从32位机器重新编译到64位机器,fortran,gfortran,Fortran,Gfortran,我有一个非常旧的程序,我想在我的64位计算机上运行。有很多折旧的报表。在调试过程中,我发现很多变量变为NaN或无穷大。。。因此,我将变量的长度从4字节改为8字节(即从实数改为实数*8),但现在两台计算机上的计算和结果相差很大。有人能解释一下,如果我使用更长的类型,这是否真的很重要,为什么在32位计算机上一切正常,但在64位计算机上,我得到无穷大和NaN值 另外,我使用gfortran编译器和-fbackslash-ffix-line-length-0-std=legacy-g-O0-fno-in

我有一个非常旧的程序,我想在我的64位计算机上运行。有很多折旧的报表。在调试过程中,我发现很多变量变为NaN或无穷大。。。因此,我将变量的长度从4字节改为8字节(即从实数改为实数*8),但现在两台计算机上的计算和结果相差很大。有人能解释一下,如果我使用更长的类型,这是否真的很重要,为什么在32位计算机上一切正常,但在64位计算机上,我得到无穷大和NaN值

另外,我使用gfortran编译器和
-fbackslash-ffix-line-length-0-std=legacy-g-O0-fno-inline
选项

问候,,
kozooh

您的问题可能是由于编译器之间的差异,而不是机器的位级别之间的差异。例如,一些FORTRAN 77编译器隐式地将
save
应用于所有过程(子例程和函数)局部变量。这不是标准所要求的,不应依赖此行为。当使用现代编译器编译遗留程序时,如果局部变量的值在过程调用期间保留,则需要使用
save
,这通常会导致问题。我不知道77国集团是否有这个“特点”。您可以使用编译器选项
-fno automatic
在gfortran中启用此行为

编辑:考虑:

  subroutine MySub
  logical FirstCall
  save FirstCall
  data FirstCall / .TRUE. /
  integer I

  if ( FirstCall ) then
     I = 0
     FirstCall = .FALSE.
  end if

  I = I + 1

  write (6, *) "Call", I

  end

  program main

  integer j

  do j=1, 4
     call MySub ()
  end do

  end program main
使用77国集团编译(无编译器选项),输出为:

 Call 1
 Call 2
 Call 3
 Call 4
 Call           1
 Call           2
 Call           3
 Call         129
局部变量
I
在调用
MySub
时保持其值。因此,77国集团似乎正在保存局部变量,即使没有使用
save
请求。至少在默认的优化级别

使用gfortran编译,带有选项
fbackslash-ffix-line-length-0-std=legacy-g-O0-fno inline
输出相同。现在切换到
-O3
,输出为:

 Call 1
 Call 2
 Call 3
 Call 4
 Call           1
 Call           2
 Call           3
 Call         129
有时
I
保留其值,有时不保留

将程序的一行更改为:
save FirstCall,I
,该值始终保留:

 Call 1
 Call 2
 Call 3
 Call 4

请尝试
-fno automatic
..

在两台计算机上都使用gfortran吗?不,在32位计算机上,我使用g77编译器。