将 C 数组作为可变大小的矩阵传递到 Fortran 中

2023-12-14

因此,我受委托将一些 Fortran 子例程翻译成 C。这些子例程被称为主要基于 C 的大型程序的控制流的一部分。

我从调用堆栈顶部找到的函数开始,一次翻译一个函数。

我面临的问题是将数组数据从 C 移交到 Fortran。

假设我们在 c 中声明了一个数组:

int* someCArray = (int*)malloc( 50 * 4 * sizeof(int) );

现在,需要将该数组传递到 fortran 子例程中以填充数据

someFortranFunc( someCArray, someOtherParams );

当数组到达 Fortran 语言时,它被声明为可变大小的矩阵,如下所示:

subroutine somefortranfunc(somecarray,someotherparams)
integer somefarray(50,*)

问题是 fortran 似乎没有正确调整数组的大小,因为程序出现段错误。当我调试程序时,我发现索引到

somefarray(1,2)

报告这是一个无效的索引。对第一列中任何项目的任何引用都可以正常工作,但当数组到达 fortran 时,数组中只有一个可用列。

我无法真正改变这是 fortran 中的可变大小数组的事实。谁能解释一下这里发生了什么,有没有办法可以从 C 方面缓解这个问题?

[edit]

顺便说一句,fortran 子例程是从替换的 fortran 代码中调用的,如下所示

integer somedatastorage(plentybignumber)
integer someindex
...
call somefarray(somedatastorage(someindex))

其中数据存储是一个大型一维数组。不存在超出数据存储大小的问题。但不知何故,传递 C 数组和 fortran(子)数组之间的差异导致了 fortran 子例程的差异。

Thanks!


您考虑过 Fortran ISO C 绑定吗?我用它在两个方向上连接 Fortran 和 C 取得了非常好的结果。我的偏好是避免重写现有的、经过测试的代码。有一些类型无法通过当前版本的 ISO C 绑定进行传输,因此可能需要进行转换。

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

将 C 数组作为可变大小的矩阵传递到 Fortran 中 的相关文章

随机推荐

  • Ruby 中方法名称末尾的问号是什么意思?

    Ruby 中问号运算符的用途是什么 有时会出现这样的情况 assert product valid 有时它在一个if构造 它是一种代码风格约定 它指示方法返回布尔值 true 或 false 或指示 true 值 或 truthy 值 的对
  • 错误膨胀类片段 |片段没有创建视图

    我遇到这个问题 android view InflateException 二进制 XML 文件行 31 膨胀类片段时出错 片段 com myapp mgm QueryFragment 未创建视图 此问题仅在平板电脑模式下发生 如果应用程序
  • 创建类对象时,抛出错误

    class A constructor this name A M1 return M1 class B extends A constructor this id B M2 return M2 var b new B output Ref
  • 具有 Passport-local 策略的 Composer-rest-server

    我无法找到一个有效的解决方案来在composer rest server 中使用本地策略进行身份验证 事实上 只有一种可行的解决方案是使用 github 我尝试将 COMPOSER PROVIDERS 设置为 export COMPOSER
  • Pandas read_html 导致 TypeError

    我正在使用 bs4 解析 html 页面并提取表格 下面给出示例表格 我试图将其加载到 pandas 中 但是当我调用pddataframe pd read html LOTable skiprows 2 flavor bs4 我收到下面列
  • SQL Server 全文搜索转义字符?

    我正在执行 MS SQL Server 全文搜索查询 我需要转义特殊字符 以便可以搜索包含特殊字符的特定术语 是否有内置函数可以转义全文搜索字符串 如果没有 你会怎么做 坏消息 没有办法 好消息 您不需要它 因为无论如何它都没有帮助 我在我
  • Android 无法实例化活动:在路径上找不到类

    我已经将项目导入到 Eclipse 中 当我尝试运行它时 会抛出以下异常 java lang RuntimeException Unable to instantiate activity ComponentInfo com polygra
  • WSO2 API 管理器 - 向公众公开发布者和商店 URL

    我在用着WSO2 API 管理器用于创建和管理开发者社区 据我所知 API 管理器是在 WSO2 Carbon Server 上驱动的 该服务器又在 Apache Tomcat 上运行 到目前为止 我可以毫无问题地运行 WSO2 API 管
  • 如何在我的应用程序中包含 64 位和 32 位本机代码

    我无法将我的应用程序上传到 Playstore 并出现此错误 我还构建了 Android App Bundle 来上传应用程序 但再次出现此错误 此版本不符合 Google Play 64 位要求 以下 APK 或 App Bundle 可
  • 爱普生TM-T88V格式化

    我设置了一台运行 Ubuntu Server 12 04 的小机器 并直接插入 Epson TM T88V 起初我能够很好地打印 使用 lp 但自动切纸器无法工作 我意识到它只是没有使用驱动程序中包含的正确 PPD 文件 因此一旦我将打印机
  • 内联时扩展方法出错

    我想扩展一些系统类型 然后通过内联使用它们 type System String with member this foo n this n type System Boolean with member this foo n sprint
  • 无法从 WebStorm 中排除的文件夹中删除 node_modules

    Recently WebStorm marked node modules as excluded and I can t remove it from excluded list Furthermore in Directories me
  • 将参数传递给视图

    在我的 RCP 应用程序中 我有一个带有TreeViewer左侧为导航 右侧为我的视图文件夹 透视图看起来像这样 public void createInitialLayout IPageLayout layout layout setEd
  • 想要在 jQuery 中无限次地重复 div 上的动画吗?

    我想要的是 我在尝试着创建动画 using fadeIn fadOut jQuery 中的函数 我完成了动画 但它只工作一次 尽管我希望它重复多次 我尝试过的 我尝试使用 setInterval 函数执行此操作两次 其中使用 TotalDu
  • Android 7.0:'javax.net.ssl.SSLHandshakeException:连接被对等方关闭

    当我尝试从我的应用程序访问 https 网络服务时 它给出了 javax net ssl SSLHandshakeException 连接被对等方关闭 错误 相同的 Web 服务在 Chrome 浏览器中运行良好 此问题仅在 Android
  • AS3 中准确的 BPM 事件监听器

    我正在尝试以特定的 BPM 将动画与音乐同步 我尝试过使用计时器 但在处理以毫秒为单位的小间隔时它并不准确 我做了一些阅读 发现了一种替代方法 它使用一个小的无声音频文件和 SOUND COMPLETE 事件作为计时器 我在这段代码中使用了
  • Flink KeyedCoProcessFunction 处理状态

    I use KeyedCoProcessFunction使用来自另一个流的数据丰富主数据流的函数 Code class AssetDataEnrichment extends KeyedCoProcessFunction String Pa
  • 为什么这个整数除法会得到 0?

    有人可以告诉我为什么下面的代码会输出0在标记线上 似乎一切都是正确的 但是当我尝试在接近尾声时得到结果时 它每次都给我 0 include
  • 如何使用 JSTL sql 标签

  • 将 C 数组作为可变大小的矩阵传递到 Fortran 中

    因此 我受委托将一些 Fortran 子例程翻译成 C 这些子例程被称为主要基于 C 的大型程序的控制流的一部分 我从调用堆栈顶部找到的函数开始 一次翻译一个函数 我面临的问题是将数组数据从 C 移交到 Fortran 假设我们在 c 中声