gpt4 book ai didi

function - 具有 Fortran 函数的有组织的库

转载 作者:行者123 更新时间:2023-12-02 06:07:22 25 4
gpt4 key购买 nike

我正在尝试制作一个有用函数库。我对此还不太了解,但显然他们中的大多数,如果不是全部,都需要包含在一个模块中(或在程序内部的一个接口(interface)中,但由于这样做的目的是制作一个库,所以不' 似乎是一个选择)否则我将在其中使用它们的程序将无法识别它们。

我可以用一个包含所有这些功能的模块制作一个长文件,但我想将不同的功能保留在不同的短文件中。然而,如果我这样做,我将不得不为每个函数制作一个不同的模块,如果我想在一个程序中使用它们,我将有一个很长的 USE 声明列表(不是提及将生成的 .mod 文件的数量)。

我能想出的唯一可能的解决方案是制作另一个模块,只为所有其他模块声明 USE,但我认为必须有另一种方法让库包含到目前为止还没有的功能。


另外,为什么我遇到函数问题而不是子程序问题?是不是因为命令 CALL 立即将该行标识为子例程调用,而函数仅按名称调用,没有命令告诉编译器“嘿,这是一个函数”,所以它必须知道什么是一个函数,什么不是事先?


我包括一个示例(按照 http://www.oceanographers.net/forums/showthread.php?378-How-to-make-a-FORTRAN-library 中的说明,并使用正确的“路径”)。

测试函数.F90

FUNCTION SumNum(nNum1,nNum2) RESULT(nResult)  
IMPLICIT NONE
INTEGER,INTENT(IN) :: nNum1,nNum2
INTEGER :: nResult

nResult=nNum1+nNum2

RETURN;END FUNCTION

测试程序.F90

PROGRAM TestProg  
IMPLICIT NONE

WRITE(6,*) SumNum(2,2)

STOP;END PROGRAM

命令行

> gfortran -c TestFunc.F90 -o TestFunc.o  
> ar ruv libmylib.a *.o
> gfortran TestProg.F90 -o Test.x -L/path -lmylib.a

TestProg.F90:6.12:

WRITE(6,*) SumNum(2,2)
1
Error: Function 'sumnum' at (1) has no IMPLICIT type

最佳答案

我的建议是将您的函数和子例程都放入一个模块中,然后使用该模块。将逻辑上相关的放在同一个模块中。每个过程使用一个模块似乎很不方便——您为什么更喜欢这种方法?将过程(函数和子例程)放入模块然后“使用”该模块的原因是它使接口(interface)“显式”,以便编译器可以检查调用中的实际参数与过程的伪参数之间的一致性。这将发现许多类型的错误并节省您的编程工作量。与编写声明(“接口(interface)”)相比,它既简单又自动。您不必编写过程声明和接口(interface),也不必在进行修改时保持它们的一致性。是的,“call”语句帮助编译器识别子例程,但是通过模块使接口(interface)显式化的优势需要函数和子例程的模块。

编辑以回答评论:是的,即使将程序放入库中,我也会将它们放入单个模块中。如果过程完全不相关,那么它们可能属于不同的库和不同的模块。如果相关,则在同一个库和同一个模块中。 Fortran 提供了一些功能来管理在同一模块中有许多过程可能出现的“问题”:您可以在“use”语句中明确使用哪些过程,并通过使用“only”子句避免名称冲突,仅列出那些过程被使用。如果默认名称与另一个名称冲突,您甚至可以重命名要使用的过程。

关于function - 具有 Fortran 函数的有组织的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7586740/

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