【问题标题】:how to link main and subprograms in Fortran95?Fortran95如何连接主程序和子程序?
【发布时间】:2014-12-14 12:36:57
【问题描述】:

如何将外部子程序链接到 Fortran 中的主程序? 虽然,我从题为《Fortran 90 for science and Engineers》的书中得到了答案 如下:

还要注意,由于外部子程序位于单独的 来自主程序的文件,必须单独编译。在下面 FTN90 一种中间类型的机器码,称为可重定位二进制 在扩展名为 .OBJ 的文件中生成。这反过来必须是 通过称为 a 的特殊程序与调用程序链接 链接器,最终生成主程序的 .EXE 版本。您的 编译器手册将详细说明如何执行此操作。一旦是 最后调试,外部子程序永远不需要重新编译, 只链接。这可以防止您浪费时间编译它 和以上,如果它是一个内部子程序就是这种情况。

无论如何,我没有找到任何关于如何链接主程序和子程序的手册。我使用 Silverfrost (Plato) 来调试和运行程序。另外,我在系统上安装了“Intel Parallel Studio XE 2011”。

【问题讨论】:

  • 您是否尝试对所有文件调用编译器? compilername file1.obj file2.obj?
  • 其实我不知道怎么调用 . obj 文件@VladimirF,但现在我找到了一种方法。现在,我使用英特尔并行工作室同时运行程序和子例程。他们工作了。但是,我认为我找到的方式似乎不是标准和通用的方式。我猜英特尔并行工作室将它们联系起来。是真是假?
  • 你是怎么做到的?请注意,Studio(只是您看到的窗口)和实际编译器之间存在差异。
  • 过程如下: 1- 打开 Microsoft Visual Studio 2- 文件> 新建项目 > FTN95 应用程序 3- 在解决方案资源管理器上有两个文件夹,包括:包含文件和源文件 4- 我写了Source Folder下的主程序和Includes Folder 5下的子程序-写完后开始调试
  • 我建议您从命令行工具开始,当您了解正在发生的事情时转移到 IDE。只是我的 2 美分。

标签: linker fortran object-files


【解决方案1】:

暂时我将假设外部子程序(函数或子程序)与主程序位于同一目录中。在 fortran77 或更早的时代,您只需从主程序调用子例程,并将它们与主程序和子程序中都存在的 COMMON 语句链接。然而,现在首选的方法是将外部子程序写入模块并使用 USE 语句链接模块。例如,让我们组成一个虚构的子程序,它读入一个值“x”并对其进行处理,以将“y”和“z”的值反馈给主程序。程序和模块可能类似于下面的示例。本质上,Fortran 尝试变得有点面向对象的模块,因为它确保数据被封装到程序中并且不能全局访问,除非程序员希望它是全局的。如果子程序仅由模块中的其他程序调用,程序员将子程序声明为 PRIVATE 很重要,如果它由主程序调用,则声明为 PUBLIC。此外,为了确保正确使用数据,如果变量仅被送入例程、例程之外或将被调用,则应将其声明为 INTENT(IN)、INTENT(OUT) 或 INTENT(INOUT)他例行公事,工作并反馈到主程序。我希望这会有所帮助,如果不能随意提出任何其他问题。此外,当用外部子程序编译主程序时,按子程序的顺序调用它们。这意味着不要使用 ifort main.f90 module.f90,而是必须输入 fort module.f90 main.f90 假设您使用的是 intel 编译器,如果没有,则将 fort 替换为编译器使用的任何命令。

   PROGRAM MAIN
   USE Test
   IMPLICIT NONE
   REAL :: X,Y,Z
   X = 5.0
   WRITE(*,*) X,Y,Z
   END PROGRAM MAIN

   MODULE Test
   PUBLIC :: Subroutine_Example
   CONTAINS 

   SUBROUTINE Subroutine_Example(X,Y,Z)
   REAL, INTENT(IN) :: X
   REAL, INTENT(OUT :: Y,Z
   Y = X + 34.6
   Z = X - 1.4
   END Subroutine_Example
   END MODULE Test

【讨论】:

  • 非常感谢。这真的很有用。再次感谢。
  • 另外,我可能会补充一点,现在,寻找主要使用函数而不是子例程进行编程的方法被认为是一种很好的做法。使用函数有助于防止覆盖主程序和子程序都可以访问的变量的可能性。但是一个函数只返回一个变量或者一个数据数组,所以主要用函数来编程需要一些先见之明。
猜你喜欢
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
相关资源
最近更新 更多