我尝试在Fortran中引入复值数组和变量。对于以下代码
program
integer :: i , j !two dimensional real array
real(dp) :: m1(3,2)
complex(dp) :: a1(3,2),a2(3,2), c0, c1
!assigning some values to the array numbers
c0 = (1.0_dp, 0.0_dp)
c1 = (0.000000001_dp, 0.0_dp)
do i=1,3
do j = 1, 2
a1(i,j) = c0*i*j
end do
end do
do i=1,3
do j = 1, 2
a2(i,j) = c0*i*j + c1
end do
end do
do i=1,3
do j = 1, 2
if (dabs( dreal(a1(i,j)) - dreal(a2(i,j))) > 1.e-6 then
write (*,*), 'warning',i,j, a1(i,j), a2(i,j)
end if
end do
end do
write (*,*), a1(1,1), a2(1,1)
end program 伊福给了我
complex(dp) :: a1(3,2), a2(3,2)
-----------^为什么复杂(Dp)需要编译时常数,以及如何修复它?谢谢。
发布于 2020-04-21 09:57:22
类型参数dp必须是常量,请参阅Fortran - setting kind/precision of a variable at run time
但是,您没有与链接中的问题相同,您根本没有尝试定义dp!首先,您必须使用IMPLICIT NONE,这是绝对必要的安全编程和最大的问题与您的代码。然后,它将告诉您,没有声明dp的类型。
你只需要用一种常用的方式来定义这种常数,作为一个常数。最简单的是:
program main
!NECESSARY!
implicit none
integer, parameter :: dp = kind(1.d0)请注意,我将程序命名为main,您必须给程序命名。或者干脆忽略program。
关于定义真实种类的更多信息,可以在Fortran 90 kind parameter上找到。
另一个注意事项:忘记dabs()和dreal()。dabs()是Fortran 66的老遗迹,而dreal()根本不是Fortran的标准。只需使用abs和dble()或更好的real( ,dp)。
https://stackoverflow.com/questions/61333291
复制相似问题