【问题标题】:Non-variable expression in variable definition context compilation error变量定义上下文编译错误中的非变量表达式
【发布时间】:2018-02-08 05:05:54
【问题描述】:

我在使用 gfortran 5.4 和 .f90 代码时遇到此编译错误

call abc_output(struc,nx,ny,nz,'AB'   ,get_ab_dat(p_f),&
                                                1
Error: Non-variable expression in variable definition context (actual argument to INTENT = OUT/INOUT) at (1)

产生编译错误的方法调用如下所示 并且错误在 get_ab_dat

type(b_f)                :: p_f
call abc_output(struc,nx,ny,nz,'AB'   ,get_ab_dat(p_f),&
                               'BD'   ,get_bc_dat(p_f),&
                               'EF' ,  aaa )

get_ab_dat函数如下图

function get_ab_dat(bf) result(qx_arr)
  type(b_f),intent(in) :: bf
  real,dimension(:,:,:),allocatable :: qx_arr
  qx_arr = bf%qx
end function get_ab_dat


subroutine abc_output (struc,nx,ny,nz,dname1,data1,&
       dname2,data2,dname3,data3,dname4,data4)

type(c_s),intent(in)                 :: struc
integer,intent(in)                           :: nx,ny,nz     
character(len=*),intent(in)                  :: dname1
real,dimension(:,:,:),allocatable,intent(inout)          :: data1
character(len=*),intent(in),optional         :: dname2,dname3,dname4    
real,dimension(:,:,:),allocatable,intent(inout),optional ::                 data2,data3,data4

有人能解释一下这个错误的含义以及我该如何解决它吗?

【问题讨论】:

  • 请显示完整的代码和完整的错误信息。错误消息中的 (1) 指向哪里?
  • 顺便说一句,您的代码不是 Fortran 90,而是 Fortran 2003,所以 fortran90 标记令人困惑。文件扩展名 .f90 不代表 Fortran 90,它意味着固定格式的源代码。
  • 可能与abc_output 相关联,显示。
  • @agentp - abc_output 非常大。我可以在顶部发布声明部分吗?
  • 是的,你可以。事实上,争论的意图就足够了。无论如何,它可能是重复的。

标签: fortran gfortran fortran2003


【解决方案1】:

您不能将表达式或常量发布到 intent(OUT)intent(INOUT) 参数。您必须始终传递一个变量,因为它可以在您调用的过程中进行更改。

因此,因为abc_output 的第六个参数是intent(OUT) 或(更有可能)intent(INOUT),您首先必须将get_ab_dat(p_f) 的值分配给一个变量,然后您必须将该变量传递给abc_output。小心参数别名。

在这种特殊情况下,参数也是allocatable,因此变量也必须是allocatable

【讨论】:

    猜你喜欢
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2013-08-01
    相关资源
    最近更新 更多