gpt4 book ai didi

c - 在 Fortran 中使用模块 : Undefined reference to `parse_'

转载 作者:行者123 更新时间:2023-11-30 15:07:47 26 4
gpt4 key购买 nike

我正在尝试使用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 的顶部。

最佳答案

当我们有类似的事情时

program
end program

function func()
end function

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

缺乏知识的部分原因是,在问题的示例中,子例程 parse 在主程序中具有显式接口(interface)(通过模块)这一事实与 计算

也就是说,函数calculate有自己的作用域并且没有宿主。要访问模块过程parse,它本身可以使用模块strings:

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

这暗示着我们没有意识到 parsestrings 中的一个模块过程。 parse_ 中的名称修饰(单个尾部下划线)是破坏外部过程的常见方法。模块过程(不带 bind(c))通常具有更复杂的符号名称。

最后,我会重复一下评论中的一些内容。前面我说过主程序对外部函数知之甚少。在主程序中我们有声明

integer ... calculate

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

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

函数calculate不仅具有显式接口(interface)(也消除了主程序中对返回声明的需要),而且还可以通过以下方式访问parse:主办协会。

关于c - 在 Fortran 中使用模块 : Undefined reference to `parse_' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37946264/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com