我正在尝试创建一个模块,该模块的子例程将另一个子例程的名称作为参数。这是一个主程序(main.for):
program testmod
use action_mod
call main
end program testmod
这是我的模块(action_mod.for)的示例:
module action_mod
abstract interface
subroutine sub_interface(aA, aB)
integer aA, aB
intent(in) aA
intent(out) aB
end subroutine
end interface
contains
subroutine main
procedure(sub_interface) sub2,sub1
call action(sub1)
call action(sub2)
end subroutine
subroutine action(sub)
procedure(sub_interface) sub
integer argA, argB
argA = 10
call sub(argA, argB)
write(*,*) argA," > ",argB
end subroutine
subroutine sub1(i,o)
integer i,o
o = 100
return
end subroutine sub1
subroutine sub2(i,o)
integer i,o
o = 200
return
end subroutine sub2
end module action_mod
我用
编译代码的地方gfortran -o main action_mod.for main.for
我收到错误
/tmp/ccdSM11U.o: In function `__action_mod_MOD_main':
action_mod.for:(.text+0x1a2): undefined reference to `sub1_'
action_mod.for:(.text+0x1b1): undefined reference to `sub2_'
collect2: error: ld returned 1 exit status
但是当我将子例程sub1(i,o)
和sub2(i,o)
放入主程序时,一切正常。但是,这不是我想要的。
您能帮助我找到创建模块的正确方法吗?我的代码有什么问题?
答案 0 :(得分:1)
您遇到的问题与this other question中的问题大致相同,因此请阅读答案以获取更多详细信息。但是,这种情况有一些额外的复杂性,值得考虑。
在子例程main
中,语句
procedure(sub_interface) sub2,sub1
说有外部个过程sub2
和sub1
。模块sub1
的模块子例程sub2
和action_mod
不是这些外部过程。就链接的问题而言,这就像使声明character(255) strtok
“隐藏”模块函数strtok
一样。
您应该从子例程中删除该语句。
但是您还有其他错误要修复。模块子例程sub1
和sub2
的接口与抽象接口sub_interface
的接口不同。您需要确保sub1
和sub2
,i
和o
的伪参数的intent属性与sub_interface
的伪参数匹配。