Function 为两个语句函数生成代码时出现未定义的引用错误
在构建代码时,我收到两个语句函数的“未定义引用错误…”错误。它编译成功 在定义了必要的参数和维度之后,我的程序代码部分从下面的语句函数开始。此外,我在模块的Function 为两个语句函数生成代码时出现未定义的引用错误,function,build,module,fortran,fortran90,Function,Build,Module,Fortran,Fortran90,在构建代码时,我收到两个语句函数的“未定义引用错误…”错误。它编译成功 在定义了必要的参数和维度之后,我的程序代码部分从下面的语句函数开始。此外,我在模块的包含部分中还有其他函数/子程序 PROGRAM ...... DIMENSIONS bla bla !***** FUNCTIONS ***** !***FREE ENERGIES PER VOLUME OF INDIVIDUAL PHASES FL(X)=(
包含部分中还有其他函数/子程序
PROGRAM ......
DIMENSIONS bla bla
!***** FUNCTIONS *****
!***FREE ENERGIES PER VOLUME OF INDIVIDUAL PHASES
FL(X)=((1.-X)*GCU_L+R*T*((1.-X)*DLOG(1.-X)))
DFI(X)=2.*CC*(X-0.435)/VM
*****************************
VM=20.65D-6
R=8.3145
T=250. + 273.
TEMP=T
GCU_L=5194.277+120.973331*T
bla bla
END PROGRAM
我收到的生成错误:
gfortran -Wall -o "123456" "123456.f90" (in directory: /Geany)
/tmp/ccwapaHQ.o: In function `__mymodule_MOD_fsteady':
123456.f90:(.text+0x7e3a): undefined reference to `fl_'
123456.f90:(.text+0x7ea9): undefined reference to `dfi_'
**DELETED THE REST**
collect2: error: ld returned 1 exit status
Compilation failed.
我认为将语句函数复制到模块的包含部分可能会解决错误。但是,它会产生以下编译错误
gfortran -Wall -c "123456.f90" (in directory: /Geany)
Compilation failed.
123456.f90:523.127:
FL(X)=((1.-X)*GCU_L+R*T*((1.-X)*DLOG(1.-X)))
1
DFI(X)=2.*CC*(X-0.435)/VM
1
Error: Unexpected STATEMENT FUNCTION statement in CONTAINS section at (1)
123456.f90:1332.16:
USE myModule
1
Fatal Error: Can't open module file 'mymodule.mod' for reading at (1): No such file or directory
首先要指出的是,语句函数在当前FORTRAN中是过时的,我建议你们考虑避免使用它们。
然而,您的第一个子问题实际上并不特定于语句函数,而是范围。您的函数是在主程序中声明/定义的:您不能期望它们在与该程序相关联的模块中可用,就像您期望变量可用一样。使用关联则相反,使模块中的实体在主程序(或使用模块的其他东西)中可用
语句函数与内部过程稍有不同,它们不能是模块中过程引用的实际参数。您可以将主程序中的“适当”函数contain
ed传递给模块过程,而不是语句函数
您尝试将语句函数移动到模块本身中是第二个子问题。不能在模块中定义语句函数。它不能在包含的语句之前,也不能在后面(在标准中,每个语句都有限制)
很难看出,如果将主程序中的语句函数更改为模块的完整函数(在包含之后),您会丢失任何内容。我猜在第一种情况下,您在模块mymodule
中的过程fsteady
中引用了fl
。你能确认一下吗,给我看看吗?是的。你是对的。那我该怎么办呢?在模块中可以有语句函数,但只能在包含的过程中。不是“裸体”,谢谢。你回答了我脑海中的许多问题。除第三段外,我理解你所有的段落。此外,我意识到有时人们在模块之外的任何地方使用CONTAIN,我不知道这意味着什么…contains
在其他地方引入了可以传递的内部过程(以F2008的方式)。最近你可以看到一个关于这个的问题。