我正在尝试使用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的顶部。
答案 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
有人暗示parse
是strings
中的模块程序。 parse_
中的名称修饰(单个尾随下划线)是破坏外部过程的常用方法。模块程序(没有bind(c)
)通常具有更复杂的符号名称。
最后,我将从评论中重复一些内容。早些时候,我说主程序对外部功能知之甚少。在主程序中我们有声明
integer ... calculate
表示外部函数calculate
(具有隐式接口)的返回类型为整数。在这种情况下,该函数可以改为内部函数
program
use strings, only : parse
contains
integer function calculate
end function
end program
并且函数calculate
不仅具有显式接口(还删除了主程序中对该返回声明的需要),而且还可以通过主机关联访问parse
。