在Fortran中使用模块:对`parse_'的未定义引用

时间:2016-06-21 13:47:04

标签: c fortran ipc

我正在尝试使用the parse routine described here来解析Fortran90中的字符串。按照文档中的链接,可以download a .zip with two f90-files,我已经完成了。然后我编译了它们gfortran -c precmod.f90 && gfortran -c stringmod.f90。我还在我的程序中添加了use strings

尽管如此,我在编译(gfortran stringmod.o precmod.o calcs.o server.o)时收到以下错误:

calcs.o: In function `calculate_':
calcs.f90:(.text+0x174): undefined reference to `parse_'
collect2: error: ld returned exit status 1

calcs.f90如下所示,server.o是用C编写的服务器,应由calcs调用。

program name
use strings
use iso_c_binding, only: C_CHAR, C_NULL_CHAR, C_INT

implicit none

    ! type declaration statements
    character(255) query
    integer calc, ans, portnum, calculate

    interface
        subroutine server(portnum) bind(C, name="server")
            use iso_c_binding, only: c_int
            integer(kind=c_int), value :: portnum
        end subroutine server
    end interface

    ! executable statements
    print *, "Please provide me with a port number. Plz. <3"
    read "(1i9)", portnum
    call server(portnum)

end program name

function calculate(query)
implicit none

    character(255) query, op
    integer length, i, calculate
    integer, dimension (:,:), allocatable :: inputarray

    call parse(query, ' ', inputarray, length)

    do i=1,size(inputarray)
        print *, inputarray(i, 1)
    end do

    calculate = 5

end function calculate

我尝试将public添加到stringmod.f90的顶部。

1 个答案:

答案 0 :(得分:1)

当我们有类似

的东西时
program
end program

function func()
end function

然后函数func外部函数,即使在与主程序相同的源代码文件中给出它。这个外部函数对主程序一无所知,反过来主程序对外部函数知之甚少。

缺乏知识的一部分是,在问题的例子中,子程序parse在主程序中具有显式接口(通过模块)这一事实与calculate无关。

即,函数calculate有自己的范围,没有主机。要访问模块过程parse,它本身可以使用模块strings

function calculate(query)
  use strings, only : parse
  implicit none
end function

有人暗示parsestrings中的模块程序。 parse_中的名称修饰(单个尾随下划线)是破坏外部过程的常用方法。模块程序(没有bind(c))通常具有更复杂的符号名称。

最后,我将从评论中重复一些内容。早些时候,我说主程序对外部功能知之甚少。在主程序中我们有声明

integer ... calculate

表示外部函数calculate(具有隐式接口)的返回类型为整数。在这种情况下,该函数可以改为内部函数

program
  use strings, only : parse
 contains
  integer function calculate
  end function
end program

并且函数calculate不仅具有显式接口(还删除了主程序中对该返回声明的需要),而且还可以通过主机关联访问parse