【问题标题】:How to set a mpreal parameter inside a Fortran module [duplicate]如何在 Fortran 模块中设置 mpreal 参数
【发布时间】:2015-06-05 20:04:42
【问题描述】:

我真的很希望能够在 Fortran 模块中定义一些参数,以便主程序及其所有子程序可以访问它们。

问题是即使我尝试在程序主体中声明它们,例如:

type (mp_real), parameter :: p1   = 1.98342E+5 !(or say 1.1d0)

我收到以下错误:

错误:无法在 (1) 处将 REAL(4) 转换为 TYPE(mp_real)

基本上我在程序主体中设置参数的值是没有问题的,但是如果我尝试在变量声明区域内进行设置,gfortran 就不高兴了。这使我无法在模块中定义它们。 有没有办法使用mpreal 设置模块内的参数值,或者我应该重做整个程序?

【问题讨论】:

    标签: module fortran


    【解决方案1】:

    我最好的猜测是您正在使用 mpfun 库,它定义了一个类型 mp_real 正是您如何使用它。

    然后,它们重载赋值运算符以便能够转换类型。此运算符在编译时不可用,这会导致您得到错误。

    这里有一个例子来说明这一点:

    module test_mod
    
      type my_type
        integer :: val
      end type
    
      interface assignment (=)
        module procedure my_assign
      end interface
    
    contains
    
      subroutine my_assign( t, v )
        type(my_type),intent(out) :: t
        integer, intent(in)       :: v
      end subroutine
    end module
    
    program test
      use test_mod
    
      type(my_type),parameter :: t = 1
    end program
    

    据我所知,不可能按照您建议的方式使用派生类型。但是,您可以将 p1 存储为真实值,并使用初始化子例程...

    【讨论】:

    • 是的,我也认为这可能是问题所在,因为当我在参数声明中使用 mpreal(1.1d0) 时,它告诉我“Error: Function 'mpreal' in initialization expression at (1)一定是内在函数” 谢谢您的回复。然后我将不得不重新编写代码。
    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2017-08-23
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多