【问题标题】:C calling Fortran subroutineC 调用 Fortran 子程序
【发布时间】:2012-09-19 02:59:33
【问题描述】:

我是该网站的新手,这看起来可能是一个获得一些提示和帮助(如果有)的地方。

我正在学习“C 调用 Fortran 子程序”,我对 C 有所了解,但对 Fortran 了解不多。

另外的一面:我看过一些例子,并且能够编译一些。

消极的一面:我有些失落。我有一个可以使用 C 或 Fortran 90 以及 print_matrix.f 和 print_matrix.c 设计的主程序。

在 main.c 程序中,
- 填充矩阵大小为 3 x 3 的 1-9 数组
- 调用 c 函数
- 调用 fortran 子程序

我已经有人口稠密的一面(它可能不准确),但我被困在子程序上。 fortran 和 C 的输出必须相同,它将使用 makefile 通过 print_matrix.f90 和 print_matrix.c 输出。我需要呼叫子程序部分的帮助,我只是不知道从哪里开始:(

我只是需要帮助,任何将不胜感激。

【问题讨论】:

  • 你真的只限于 Fortran 90 吗?如果您可以使用 2003 版 Fortran 标准中的功能,那么 Fortran 和 C 之间的互操作性将会更加容易。
  • 请记住,C 和 Fortran 以不同的方式存储矩阵。在 C 中,存储是行优先的,这意味着 mat[i][j]mat[i][j+1] 在内存中是相邻的。在 Fortran 中,使用了以列为主的存储,即 mat(i,j)mat(i+1,j) 在内存中是相邻的。这意味着 Fortran 将 C 数组视为转置的,反之亦然,在两种语言中定义矩阵维度和迭代矩阵元素时,您必须牢记这一点。

标签: fortran90


【解决方案1】:

老实说,要准确说出您的问题是什么有点困难。但这是一个适用于我的 linux 机器的示例:

callf.c:

  #include<stdio.h>
  int main(int argc, char **argv) {
  int i=0;
  increment_(&i);
  printf("%d\n",i);
  return;
  }

increment.f90:

subroutine increment(n)
integer n
n=n+1
return
end subroutine

编译:

gcc -c callf.c
gfortran -c increment.f90
gcc callf.o increment.o -lgfortran

结果:

> ./a.out
1

两个困难的部分是 1) 获取函数调用的确切名称和 2) 知道链接两个代码需要哪些标志。回复:1)我知道使用“increment_”,因为在编译我的 FORTRAN 代码后,我在 increment.o 上运行了“nm”实用程序,发现对象的名称是“increment_”。在某些系统上,您可能会看到“INCREMENT”、“_increment”或各种其他内容。回复:2)信息应该适用于您使用的任何编译器。变化很大。

【讨论】:

  • 感谢您花时间解释!我确实在一定程度上理解你所拥有的,但有点褪色。我在代码中创建的是 C 调用 Fortran 子例程。我在 .c 文件中创建了一个函数,并在 .f90 文件中创建了一个子例程函数。我能够获得 C 版本的输出,但无法获得 Fortran 版本的输出,这是我现在坚持的地方。这可能是小事,但我不确定。我是 Fortran 的新手,我只是不清楚为什么没有输出。
  • 没问题。老实说,没有看到您正在编写的一些实际代码,我想我不能说更多。我有点怀疑其他人也能做到。可以出示一下代码吗?
  • @bob.sacamento 任何可移植的混合 C/C++ 和 Fortran 代码都应使用 Fortran 中的 ISO_C_BINDING 机制,以免依赖于特定的名称修改或语言类型兼容性。在 SO 上有很多使用ISO_C_BINDING 的问题和示例。
猜你喜欢
  • 1970-01-01
  • 2014-01-14
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多