2014-02-21 88 views
0

管理我有一个问题,希望不会影响我的数值计算用Fortran 90如何在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

您需要分配使用'ALLOCATE()'函数分配数组。 – ja72

+0

什么错误?目前还不清楚你在问什么。 – ja72

+0

我添加了一个更简洁的使用数组的处理。 错误是该数组被声明为真实的,但我可以初始化为一个复数或实数,而 问题是为什么这是有效的。 – user2820579

回答

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有两种选择:从gfortran -O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fcheck=all -std=f2008 -pedantic -fbacktrace

输出:

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是这么多,这个特殊的任务更简单。)