我有一个问题,希望不会影响我在Fortran 90中的数值计算。
问题是我有一个声明为
的数组Real(r8), Allocatable :: matKBody(:)
通过我的手,初始化这样的数组,我就像
一样allocate(matKBody(1:Nk), STAT=ierr)
If (ierr /= 0) Stop
matKBody(:) = ( 0.0_r8, 0.0_r8)
这是一种初始化复杂数组的方法。我注意到这个错误,但我很惊讶 如果我以这种方式初始化这样的数组或使用'正确'语句无关紧要:
matKBody(:) = 0.0_r8
...
... ! Do some stuff with the array
...
Deallocate( matKBody, STAT=ierr )
If (ierr /= 0) Stop
如果我打印两个数组,它们会给我正确的初始化,即初始化 实数。
为什么fortran(或编译器)不知道这类事情? (我使用ifort进行编译)。
答案 0 :(得分:1)
完整示例:
program test_convert
use, intrinsic :: ISO_FORTRAN_ENV
Real(real64), Allocatable :: matKBody(:)
allocate (matKBody (1:10) )
matKBody(:) = ( 0.0_real64, 0.0_real64)
end program test_convert
使用gfortran编译并附带选项:-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fcheck=all -std=f2008 -pedantic -fbacktrace
gfortran的输出:
matKBody(:) = ( 0.0_real64, 0.0_real64)
1
Warning: Possible change of value in conversion from COMPLEX(8) to REAL(8) at (1)
所以有些编译器会“意识到”这些事情,并会在你要求时告诉你。
正如评论中所讨论的,Fortran在分配时提供类型之间的自动转换。所以这不是错误,但gfortran至少会提供警告,以便程序员可以检查他们是否打算进行转换。您可以通过以下方式取消警告并说明您转换的意图:
matKBody(:) = real ( ( 0.0_real64, 0.0_real64), real64 )
(这只是一个例子,因为为这个特定的作业编写= 0.0_real64
要简单得多。)