使用现代Fortran中的模块中的子例程加载派生类型

时间:2015-08-24 21:02:09

标签: module fortran gfortran subroutine

目标:使用子例程su2加载gfortran simple.f90类型的结构库。

正在运行Undefined symbols for architecture x86_64: "_load_things_", referenced from: _MAIN__ in cc7DuxGQ.o (maybe you meant: ___myclass_MOD_load_things_sub) ld: symbol(s) not found for architecture x86_64 collect2: error: ld returned 1 exit status 生成

program simple
  use myClass
  implicit none
  integer :: nThings
  type ( su2 ) :: reflections
      call load_things ( nThings, reflections )
end program simple

主程序如下:

module myClass
implicit none
type :: su2
    integer :: matrix_obj ( 1 : 2, 1 : 2 )
contains
    private
    procedure, nopass, public :: load_things => load_things_sub
end type su2

private load_things_sub
contains
    subroutine load_things_sub ( nThings, U )
        integer,      intent ( out ) :: nThings
        type ( su2 ), intent ( out ), allocatable :: U ( : )
            nThings = 2
            allocate ( U ( nThings ) )
            U ( 1 ) % matrix_obj = reshape ( [ 0, 1, 1, 0 ], [ 2, 2 ] )
            U ( 2 ) % matrix_obj = reshape ( [ 0, 1, 1, 0 ], [ 2, 2 ] )
    end subroutine load_things_sub

end module myClass

模块定义是:

public class Marks{
  long subjectCode;
  float marks;
  string name;
}

以下网页未经成功研究:Correct use of modules, subroutines and functions in fortran

Fortran 90 - to transmit values from main subroutine to the functions and other subroutines

Fortran: Calling a function in a module from a procedure in another module

Fortran 90 How to call a function in a subroutine in a module?

1 个答案:

答案 0 :(得分:2)

您的模块没有名为load_things_sub的子程序 - 它有一个名为load_things_sub的子程序。选择正确的名称变体,然后相应地更正另一个语句中的名称。

在最初提交此答案之后,OP向模块添加了一个私有语句,该语句使使用该模块的范围中的load_thing_sub不可访问。在没有其他信息的情况下,应删除私人陈述。

通过绑定引用{{1}}等程序毫无意义。只需将其作为正常程序引用即可。

请注意,许多列出的引用都是针对Fortran 90.绑定是在Fortran 2003中引入的。