如何在 GNU Octave 中运行 Fortran 程序?

2023-12-06

我想在 Octave 中运行 Fortran 程序。我想这样做是出于自动化目的,并使用 Octave 进行所有数据处理。

是否可以使用 cygwin 从八度运行 Fortran 程序,如果可以,您能给我一些沿着这个方向的指示吗?

此外,我的系统中安装了 gfortran 编译器,有没有办法利用它来完成上述任务?

此外,我尝试使用 mex 来执行相同的操作:

mckoctfile --mex HelloWorld.f

尝试 mex 方法后出现以下错误:

c:/octave/octave~1.0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\rajan\AppData\Local\Temp/oct-qur1RF.o: in function `hi': C:\Tech Stuff\Fortran Programs/HelloWorld.f:3: undefined reference to `_gfortran_st_write'
c:/octave/octave~1.0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Tech Stuff\Fortran Programs/HelloWorld.f:3: undefined reference to `_gfortran_transfer_character_write'
c:/octave/octave~1.0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Tech Stuff\Fortran Programs/HelloWorld.f:3: undefined reference to `_gfortran_st_write_done'
c:/octave/octave~1.0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\rajan\AppData\Local\Temp/oct-qur1RF.o: in function `main':C:\Tech Stuff\Fortran Programs/HelloWorld.f:6: undefined reference to `_gfortran_set_args'
c:/octave/octave~1.0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Tech Stuff\Fortran Programs/HelloWorld.f:6: undefined reference to `_gfortran_set_options'
collect2.exe: error: ld returned 1 exit status
warning: mkoctfile: building exited with failure sta

如何解决此错误以继续前进?


显然,您的特定用例可能比这复杂得多,但这里有一个简单的示例来帮助您入门(或帮助您决定是否值得走这条路......)

让我们从一个简单的 octfile 开始,它执行简单的整数加法,目前不涉及 Fortran。

// in: simple_addition.cpp 
#include <octave/oct.h>

DEFUN_DLD (simple_addition, args, ,"Add two integers via C++")
{
  octave_value retval = args(0).int_value() + args(1).int_value();
  return retval;
}

Compile:

mkoctfile -c simple_addition.cpp                 # compiles a simple_addition.o file
mkoctfile -o simple_addition simple_addition.o   # links .o file to named output file

以八度为单位:

octave:1> simple_addition(1,2)
ans =  3

现在让我们先把这个放在一边,看看如何从纯 C++ 调用 Fortran 定义的函数。首先让我们创建一个简单的整数加法函数:

 ! in fortran_addition.f90 
 function fortran_addition(a,b) result(Out)
    integer, intent(in) :: a,b ! input
    integer             :: Out ! output
    Out = a + b
 end function fortran_addition

并使用 gfortran 编译它:

gfortran -c fortran_addition.f90    # creates fortran_addition.o

你可以看到(例如使用nm fortran_addition.o)生成的对象包含对该名称下的符号的引用fortran_addition_(注意最后添加的下划线)。

现在让我们创建一个普通的(即非八度相关的)C++ 包装程序,它调用通过此符号定义的函数:

// in generic_fortran_addition_wrapper.cpp
#include <iostream>
extern "C" { int fortran_addition_( int *, int * ); }
int main() {
    int a = 1, b = 2, fortran_result;
    fortran_result = fortran_addition_( &a, &b );
    std::cout << a << " + " << b << " = " << fortran_result << std::endl;
}

compile:

g++ -c generic_fortran_addition_wrapper.cpp
g++ -o addints generic_fortran_addition_wrapper.o fortran_addition.o
./addints   # outputs `1 + 2 = 3` on the terminal

现在我们拥有了创建包装 fortran 函数的 octfile 的所有要素:

// in fortran_addition_wrapper.cpp
#include <octave/oct.h>
extern "C" { int fortran_addition_( int *, int *); }
DEFUN_DLD (fortran_addition_wrapper, args, ,"Add two integers via fortran")
{
  int a, b, fortran_result;
  a = args(0).int_value();
  b = args(1).int_value();
  fortran_result = fortran_addition_( &a, &b );
  octave_value retval(fortran_result);
  return retval;
}

使用 mkoctfile 编译:

mkoctfile -c fortran_addition_wrapper.cpp
mkoctfile -o fortran_addition_wrapper fortran_addition_wrapper.o fortran_addition.o

然后八度:

octave:1> fortran_addition_wrapper(1,2)
ans =  3

话虽如此,显然如果您有一个完全定义的 fortran 程序,而不仅仅是可链接函数,并且您的系统上有一个正在运行的已编译可执行文件,那么您可以跳过所有上述“手续”,只需通过system()来自八度的命令。显然,在这种情况下,您需要以与八度音程无关的方式传递数据……但如果您有一个独立的 fortran 可执行文件,那么它可能已经有一种从操作系统读取输入数据的方法。

EDIT根据下面的评论,有人提醒我,我偏离了方向,回答了原始问题的评论中提出的问题,却忘记解决原始问题中的错误消息。正如我在评论中提到的,mkoctave 是 gnu 编译器集合的通用包装器。这些消息听起来并不是特定于 Octave,而是编译器/链接器抱怨您缺少定义这些基本函数的 Fortran 运行时库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 GNU Octave 中运行 Fortran 程序? 的相关文章

  • fortran 77 到 fortran 90 的转换器软件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有 fortran 77 编码 但我想转换为 fortran 90 在哪里可以下载转换器软件 这是我帮
  • MATLAB 求最大值一个结构体的

    我试图找到结构的最大值但是max tracks matrix 不起作用 它给我以下错误 使用 horzcat 时出错 CAT 论证维度不一致 你有想法吗 这是我的结构的样子 tracks 1x110470 struct array with
  • Fortran 中指数函数的 DEXP 或 EXP?

    我有两个非常简短的问题 1 我刚刚读到DEXP is the archaic的形式EXP 这是否意味着不应再使用它 我一直以为DEXP 双精度等于EXP 2 指数函数的范围是多少 它依赖于编译器吗 问题 1 在现代 Fortran 中 最好
  • 将数组作为声音播放并并行记录其输出

    我知道 Octave MATLAB 可以将数组作为声音播放 但我想知道 Octave 是否可以做到这一点 我想循环播放一系列频率 并让 Octave 使用计算机上的扬声器播放它们 并让 Octave 也记录使用麦克风输入的声音来获取最大值
  • Fortran 读取混合文本和数字

    我正在使用 Fortran 90 读取包含以下格式数据的文件 number 125 var1 2 var2 1 var3 4 number 234 var1 3 var2 5 var3 1 我尝试了以下命令并且工作正常 read 2 tem
  • Fortran:向文件添加列(即跳过不同数量的水平空格)

    我是 Fortran f90 的初学者 一些看似简单的问题结果却导致严重头痛 感谢您帮助我解决这个问题 我的代码运行一个循环 处理数据并将它们写入文件 我希望将这些数据写入同一文件的列中 直到循环完成 OPEN unit 11 file f
  • Octave/Matlab:向向量添加新元素

    有一个向量x我必须添加一个元素 newElem 有什么区别吗 x end 1 newElem and x x newElem x end 1 newElem更稳健一些 x x newElem 仅当x是行向量 如果它是列向量x x newEl
  • Fortran 03/08(gfortran 编译器)中使用无限多态类型进行数组操作

    我想通过以下方式实现有用的数组操作 添加元素 删除元素 通过可分配 指针 二叉树结构实现不同的实现 class 特征 无限多态性 我使用 gfortran 5 0 应该可以处理这样的功能 我需要它 以免为我使用的每种类型重复相同的代码 这应
  • FORTRAN 写()

    在开始之前 我必须先声明一下 我是 FORTRAN 的新手 我正在维护 1978 年的一段遗留代码 它的目的是从文件中读取一些数据值 处理这些值 然后将处理后的值输出到另一个文本文件 给出以下 FORTRAN 代码 INTEGER NM S
  • 关于for循环中的fortran continue语句的问题

    我正在分析 Fortran 代码并有一个简单的问题 我想知道下面代码中 100 和 200 处的 继续 语句的作用 它会增加 i 和 j 计数器吗 如果是这样的话 不会if not flg 那么条件包含flg循环中 flg 的 最后一个值
  • 如何在 Octave 中有效地从 csv 读取大矩阵

    有很多关于 Octave 性能缓慢的报告dlmread 我希望这个问题在 3 2 4 中得到修复 但是当我尝试加载大小为 ca 的 csv 文件时 8 4百万 总共32百万 也花了非常非常长的时间 我在网上搜索但找不到解决此问题的方法 有人
  • 从主目录隐藏八度工作区文件

    我想更改文件octave workspace从我的主目录中 只需将其重命名为 octave workspace 如何设法使 Octave 识别具有此新名称的工作区文件 或创建一个新文件 Thanks 这就是该组织的目的octave core
  • 如何调用模块中子程序内部的函数?

    我有一个包含子例程的模块 该子例程又包含一个函数 我说use themodule在我的主程序中 我可以call thesubroutine 但是如何访问子例程中包含的函数呢 代码如下所示 module useful integer para
  • 单机Octave并行计算——包和示例

    我想在单台机器 而不是集群 上并行化 Octave 中的 for 循环 前段时间我问了一个关于Octave并行版本的问题Octave并行计算 https stackoverflow com questions 7047840 paralle
  • 尝试读取名单后返回的状态不是预期的

    我想从文件中读取名单 但在名单不存在的情况下实现捕获选项 从我读到的here http msg ucsf edu local programs IBM Compilers Fortran html pgs lr76 htm我期望状态为 84
  • 使用 MacLaurin 展开的 Fortran Sine 函数的微小差异

    我正在用 Fortran 创建一个程序 它接受以弧度表示的 sin x 的 x 然后是要计算的项数 这是我的程序 Sine value using MacLaurin series program SineApprox implicit n
  • 有没有一种简单的方法来准备 Fortran 代码以进行并行调用

    我想使用 OpenMP 在 C 程序中并行求解多个大型 ODE 系统 由于某些原因 我需要使用 ODE 求解器 但我只能找到 Fortran 90 子例程 而且代码太大 无法简单地将其转换为 C 我知道 Fortran 广泛使用静态内存 因
  • forrt1:严重(170):程序异常 - 堆栈溢出

    并提前感谢您的帮助 我已经编译了一个程序 不是我编写的 它在 Mac 上运行得很好 但是当我尝试在 Windows 上执行该程序时 在程序开始执行后不久 我收到以下错误消息 forrt1 严重 170 程序异常 堆栈溢出 我不是 ifort
  • Fortran 递归分段错误

    我必须设计并实现一个 Fortran 例程来确定方格上簇的大小 并且递归地编写子例程似乎非常方便 然而 每当我的晶格大小超过某个值 大约 200 边 时 子例程就会始终出现段错误 这是我的集群检测例程 RECURSIVE SUBROUTIN
  • 如何调整x轴和y轴的大小

    如何调整 x 轴和 y 轴的大小 我想要什么 更具体 3900 60 30 0 60 120 180 3600 我做了什么 a 0 0 1 10000 plot a 我应该写什么才能按预期调整 x 和 y 轴的大小 EDIT 我不想 390

随机推荐

  • 为什么 range-v3 中不能对范围进行排序?

    使用 Range v3 版本 0 10 0 库 我尝试从 std vector 构造一个范围 将其转换为另一个范围 最后对该范围进行排序 我预计排序步骤会产生另一个我稍后可以使用的范围 但我能想到的最好的办法是 std vector
  • Firebase 托管和自定义身份验证

    是否可以使用自定义身份验证策略和 Firebase 托管 由于托管计划缺乏服务器端代码支持 这似乎不太可能 或者我错过了什么 Firebase 托管是一种向 Web 访问者提供静态资产的方法 它无法在 Firebase 的服务器上运行您的自
  • Java - OnClickListener 中的最终变量要求

    我有一个程序 其中有一个用户可以编辑的文本框 当用户按下按钮时 将创建一个对话框 显示用户的文本和确认 是 否 选项 public void setIP View v get the text inside the editor EditT
  • 使用 Aurelia 将数据和文件发布到 ASP.NET webapi

    我正在尝试将文件上传的输入添加到我的应用程序中 这是我的视图 有两个输入 一个文本和一个文件
  • 如何从 C# 打印 Word 文档

    如何从 C NET 应用程序启动文档打印 Word 文档已存在于硬盘中 我只想在按钮单击事件时开始打印该 Word 文档 ProcessStartInfo psi new ProcessStartInfo wordFilename UseS
  • 将类导出到 DLL [重复]

    这个问题在这里已经有答案了 你好 我现在对 DLL 有点困惑 所以我来这里询问哪里有很多编程专家 所以我得到了这个名为 GUI h 的类和 GUI cpp class GUI public GUI void virtual GUI void
  • itertools 中的 izip_longest:迭代器内的 IndexError 是如何工作的?

    In this问题 lazyr询问以下代码如何izip longest迭代器来自here works def izip longest from docs args kwds izip longest ABCD xy fillvalue g
  • EF6 与 MySQL。字典中不存在给定的键

    我有使用链接到 MySQL 数据库的 Code First Entity Framework 6 的 Asp Net MVC 5 应用程序 当我第一次创建数据库时 它工作正常 但是当我对模型进行更改时 然后添加迁移 更新数据库 后显示错误
  • Fortran 未格式化输出,每个 MPI 进程写入数组的一部分

    在我的并行程序中 有一个大矩阵 每个进程计算并存储其中的一部分 然后 程序通过让每个进程以正确的顺序写入自己的矩阵部分 将矩阵写入文件 输出文件为 未格式化 形式 但是当我尝试以串行代码读取文件时 我分配了正确的大矩阵大小 我收到了一个我不
  • Elmah:在 IIS7 下未调用 ErrorLog_Filtering 事件处理程序

    我在 Elmah 中启用错误日志过滤 并希望在 ErrorLog Filtering 事件处理程序中以编程方式执行此操作 它在 Visual Studio 开发服务器下运行良好 但一旦我进入 IIS7 在我的开发计算机上本地或在我的 Web
  • 无法读取其他进程正在使用的文件中的所有行

    我正在尝试读取某些程序正在使用的日志文件的所有行 当我尝试这样做时 我收到异常 System IO IOException was unhandled file used by another process 于是我在网上搜索了一下 找到了
  • Android - 在 webview 中加载 PDF

    我有这个 webview 代码 我希望当用户单击 PDF 链接时可以打开 PDF 文件 这是代码 你能告诉我我必须在其中的 PDF 区域中放入什么吗 我尝试了很多不同的方法 但根本无法查看 PDF 谢谢您的帮助 webview setWeb
  • Xcode 退出代码 1 - 重复符号

    抱歉 我知道这个问题已经被覆盖了 只是我无法解决这个问题以挽救我的生命 如果有人能清楚地解释我可能做了什么以及我可以做些什么来解决这个问题 我将永远感激不已 这是我的错误 命令 Xcode 4 Platforms iPhoneOS plat
  • 如何在 Win32 控制台应用程序中注册不可见窗口类?

    我正在尝试在 Win32 控制台应用程序中注册一个不可见的窗口 我的目标是监听 WindowProc 中的原始输入 以 1 将其显示在控制台上 以及 2 执行额外的计算 例如通过 Web 套接字发送信息 我跟着这篇 CodeProject
  • PyQt:插槽被调用多次

    我使用 Qt Designer 创建了一个自定义小部件 通过使用 pyuic 我将 ui 文件转换为 py 文件 我的意图很简单 我需要找出选择了哪个单选按钮 这是 Designer 转换后的 python 脚本ui persistence
  • C#:制作同时安装 WPF 应用程序 (ClickOnce) 和 Windows 服务的安装程序

    我目前有一个包含 2 个项目的 VS 解决方案 一个 WPF 应用程序和一个 Windows 服务 现在 我已成功让 ClickOnce 能够安装我的 WPF 应用程序 但我还希望在此安装过程中安装 Windows 服务 项目中的服务 我已
  • 在jquery中实现圆形滚动条

    我正在寻找一个 jquery 插件来模拟垂直选框 我需要它来支持 滚动任何不透明 非结构化 内容 没有 li 没有 div 用户甚至可以从 Word 进行粘贴 自动恒定滚动速度 悬停时暂停 循环滚动 滚动到结束后 从头开始平滑地继续 没有向
  • 使用python将csv中的单列解析为文本文件

    我终于把 dbf 文件变成了 csv 但现在我很困惑如何将其解析为文本文件以供进一步编辑 我一直在阅读 csv 模块 但说实话 我的头开始旋转 其中很多内容对我来说似乎是希腊语 但是 如果可能的话 我想要使用模块 this 的代码 我的 c
  • 如何在 Scala 中迭代列表时修改列表的每个元素?

    我有一个如下声明的字符串列表 var re1 emoticons Nil 然后我用表情符号 字符串 填充了其中 我正在尝试添加一个 在每个字符串的开头re1 emoticons 修改原来的var 第一次尝试 re1 emoticons fo
  • 如何在 GNU Octave 中运行 Fortran 程序?

    我想在 Octave 中运行 Fortran 程序 我想这样做是出于自动化目的 并使用 Octave 进行所有数据处理 是否可以使用 cygwin 从八度运行 Fortran 程序 如果可以 您能给我一些沿着这个方向的指示吗 此外 我的系统