首页 > 解决方案 > 错误:f77 程序中有两个主要程序

问题描述

我读了一篇有 f77 fortran 代码的论文。我想运行该程序并逐步执行它,以便将其移植到 MATLAB。但是,当我尝试运行该程序时,它不起作用。我收到以下错误:

$f77 -g Algorithm634.f 
Algorithm634.f:10.72:

      INTEGER FITDEG,DIMEN,NFPOLS,NFPTS,NEPTS,NEPOLS,EVLDEG,TOPS        
                                                                        1
Algorithm634.f:142.72:

      INTEGER DIMEN,FITDEG,NFPOLS,NFPTS,EVLDEG,NEPOLS,NEPTS             
                                                                        2
Error: Two main PROGRAMs at (1) and (2)

显然,我需要重构代码。上面列出的 (1) 生成的数据随后在 (2) 中使用。但是,我不熟悉旧的 f77 程序。我不确定该怎么做才能重构它。

Dropbox Fortran 文件和论文

编辑:我被告知不要链接到保管箱。美好的。这是整个程序:

https://pastebin.com/ULLLPmdL

标签: fortrangfortranfortran77

解决方案


我从您的保管箱下载了 Algorithm634.f。正如编译器消息所暗示的,有 2 个单独的程序,我创建为 generate.for 和 driver.for。

如果将它们编译并链接为 generate.exe 和 driver.exe,则可以运行它们。

首先生成程序,如:

gFortran generate.for -o generate.exe
generate > generate.txt

这将生成驱动程序所需的数据文件。

然后使用驱动程序,如:

gFortran driver.for -o driver.exe
driver < generate.txt > driver.txt

这将产生一些输出,您可以查看这些输出。

(实际上,我更改了 generate.for,将第一个可执行行包括为:

  open (unit=16, file='gendat.txt')

然后全部更改write (6,为,write (16,以便将输出写入文件,而不是重定向。

然后我更改了 driver.for,将第一个可执行行包括为:

  open (unit=15, file='gendat.txt')

然后全部更改read (5,为,read (15,以便从文件中读取输入,而不是重定向。

将单元 5,6 更改为 15,16 是为了避免在 1:9 范围内保留文件单元号的潜在问题,不同的 Fortran 编译器可以应用这些问题。)

我会把它留给你来确认程序是否有效。大多数 Fortran 编译器都有一个关联的“调试器”,它允许您逐步完成程序,因此您可以完成下一阶段。

code.f 或 code.for 表示代码布局为固定格式代码。与 F77 编译器一样,所有 F90+ Fortran 编译器都将识别此代码并应能应对。

总之,解决方案是将 Algorithm634.f 分成 2 个单独的文件。


推荐阅读