首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“类型参数必须是编译时常数.”在Fortran 90

“类型参数必须是编译时常数.”在Fortran 90
EN

Stack Overflow用户
提问于 2020-04-20 22:46:09
回答 1查看 2K关注 0票数 0

我尝试在Fortran中引入复值数组和变量。对于以下代码

代码语言:javascript
复制
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 

伊福给了我

代码语言:javascript
复制
   complex(dp) ::  a1(3,2), a2(3,2)
-----------^

为什么复杂(Dp)需要编译时常数,以及如何修复它?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-21 09:57:22

类型参数dp必须是常量,请参阅Fortran - setting kind/precision of a variable at run time

但是,您没有与链接中的问题相同,您根本没有尝试定义dp!首先,您必须使用IMPLICIT NONE,这是绝对必要的安全编程和最大的问题与您的代码。然后,它将告诉您,没有声明dp的类型。

你只需要用一种常用的方式来定义这种常数,作为一个常数。最简单的是:

代码语言:javascript
复制
program main

  !NECESSARY!
  implicit none

  integer, parameter :: dp = kind(1.d0)

请注意,我将程序命名为main,您必须给程序命名。或者干脆忽略program

关于定义真实种类的更多信息,可以在Fortran 90 kind parameter上找到。

另一个注意事项:忘记dabs()dreal()dabs()是Fortran 66的老遗迹,而dreal()根本不是Fortran的标准。只需使用absdble()或更好的real( ,dp)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61333291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档