Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 用fortran链接多个文件_File_Fortran_External_Subroutine - Fatal编程技术网

File 用fortran链接多个文件

File 用fortran链接多个文件,file,fortran,external,subroutine,File,Fortran,External,Subroutine,我不熟悉Fortran,但我正试图找到一种方法,可以从我编写的程序中检索信息,而不将它们作为子程序包含在我的新文件中。现在,我的新文件中有4个子例程,我希望能够将半径输入到所有4个子例程中,并接收它们各自的输出 这是我的代码的基本格式——基本上我想展示我需要4个独立的程序,以便获得当前程序表达式所需的所有变量。 到目前为止,我已经尝试使用include和call表达式,但它们无法检索我需要带回文件的信息,它们给出了“不适用”的答案 program practicedynamo 隐式无 实数:A,

我不熟悉Fortran,但我正试图找到一种方法,可以从我编写的程序中检索信息,而不将它们作为子程序包含在我的新文件中。现在,我的新文件中有4个子例程,我希望能够将半径输入到所有4个子例程中,并接收它们各自的输出

这是我的代码的基本格式——基本上我想展示我需要4个独立的程序,以便获得当前程序表达式所需的所有变量。 到目前为止,我已经尝试使用include和call表达式,但它们无法检索我需要带回文件的信息,它们给出了“不适用”的答案

program practicedynamo
隐式无
实数:A,B,C,半径
实数::b平方,v平方
读取*,半径
呼叫程序A(半径,A)
呼叫程序B(半径,B)
呼叫程序C(半径,C)
v平方=(1.0/3.0)*B
Bsquared=4*pi*密度*Vsquared
梯度=半径*C
Rvector=Bsquared*Vsquared*渐变
节气门=Rvector*sin(A)
结束程序实习达纳摩
!然后我的四个子例程将被放置在后面
!下面是我实际代码中的一个子例程的示例(上面的版本已经简化,我已经更改了变量)
子例程testdensity(半径、密度)
隐式无
实数::半径,x,太阳半径,密度

如果(radius>0.和.radius您没有提到如何编译代码,但这里有一些在单个可执行文件中包含多个源文件的一般方法。您不需要包含这些文件,只需单独编译并将它们链接在一起即可。建议编写一个Makefile来完成此操作,您可以在上找到大量示例在其他地方

要将多个文件编译成一个可执行文件,在编译时只需列出所有文件

gfortran -o output programA.f90 programB.f90 programC.90 mainprogram.f90
如果您不想将它们全部编译在一起,或者在构建时必须重新编译,则可以编译单个对象,例如

gfortran -c -o programA.o programA.f90
gfortran -c -o programB.o programB.f90
gfortran -c -o programC.o programC.f90
然后链接为

gfortran -o output mainprogram.f90 programA.o programB.o programC.o
如果您正尝试使用库,并且希望程序A-C位于独立库中,则可以首先按照上述方式编译对象,然后

ar rcs libABC.a programA.o programB.o programC.o
然后将主程序编译为

gfortran -o output mainprogram.f90 libABC.a 


如果您不使用模块,您将负责确保对外部子例程的调用与外部文件中声明的接口相匹配。为了安全起见,并让编译器捕获参数不匹配的问题,您可以在程序中声明显式接口,或将外部代码放入模块中,然后使用ose主程序中的模块。

您将radius作为子例程参数传递,这很好。您应该包括其中一个子例程(如programA)的代码以及程序的输出。您以前使用过子例程吗?我建议您在在线教程中找到一个如何使用子例程的示例。我的子例程是很好——当我使用子程序时,我可以得到我正在编写的代码,以提供我想要的一切。我只是担心当我有大量子程序时,导航可能会变得困难,我会遇到问题。尽管如果使用子程序是做这类事情的最佳方式,我会继续这样做。我将包括我的一个子程序nes让事情变得更清楚。谢谢-----我真的需要一个方向来尝试研究。我会研究makefiles,它们听起来像我需要的。
gfortran -o output mainprogram.f90 libABC.a