gpt4 book ai didi

C-Fortran 混合编程

转载 作者:太空宇宙 更新时间:2023-11-03 23:34:20 28 4
gpt4 key购买 nike

我正在做一个项目,我必须在 C 中使用 Fortran 库。在 Fortran 库中有一个包含复杂*16、4x4 数组的公共(public) block 。现在在 C 中,一个复数变量只是一个包含两个元素的结构,因为它是复数*16,所以元素应该是 long double,这是 Fortran 中对应的 C 数据类型。所以我有一个包含两个长 double 的结构。

我要访问这个数组的元素。好消息是,我已经可以将它与库的所有其他公共(public)变量一起使用。问题是我从数组中导入的元素是,

1) 顺序不对,“即使考虑到 C 和 Fotran 数组结构的差异”。

2) 虽然大多数元素是正确的,但有两个与它们应该的完全不同。

3) 只有当我使用 double 而不是 long double 时,我才能得到正确的元素(除了这两个元素)。当我使用 long double(和正确的字符转换)时,我得到了完全不同的东西,这清楚地指出了转换问题。

我已经用尽了所有的解释,但没有任何效果。我在 C 中编写数组的代码如下:

for (j=0;j<=3;j++){
printf("%s", "\n");
for(k=0;k<=3;k++){
printf("%s %d %s %d %s %s %LE %s %LE %s",
"(", k+1, "," ,j+1, ")", "{",
(long double)mssmmixing_.neunmx[k][j].dr,
" ",
(long double)mssmmixing_.neunmx[k][j].di,
"}\n");
}
}

附加信息:因为我必须混合 Fortran 对象文件,所以我使用 gfortran 来编译 C 文件。如果我改用 GNU C 编译器,它会抛出关于无法识别 gfortran 例程的错误。这也可能是问题的根源,可能是 gfortran 无法识别 C 中的长 double 。

任何帮助都是有用的。

最佳答案

为了混合使用 Fortran 和 C,我建议使用 ISO_C_Binding。它甚至有一个 Fortran 类型 C_LONG_DOUBLE_COMPLEX 匹配 C 类型 long double _Complex -- 参见 http://gcc.gnu.org/onlinedocs/gfortran/ISO_005fC_005fBINDING.html .作为 Fortran 语言标准的一部分,这些类型保证匹配(当您使用兼容的编译器时)。 C_LONG_DOUBLE_COMPLEX 很可能实际上与 complex*16 相同,但您可以在 Fortran 中尝试在两种类型之间进行复制,以防内存布局不同。您应该使用 gfortran 编译 Fortran 源文件,使用 gcc 编译 C。最容易与 gfortran 链接。 (或使用其他“品牌”编译器。)

关于C-Fortran 混合编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7953746/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com