首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++和Fortran:从C++访问Fortran公共块中的数组时出错

C++和Fortran:从C++访问Fortran公共块中的数组时出错
EN

Stack Overflow用户
提问于 2012-05-07 20:21:55
回答 5查看 1.8K关注 0票数 2

我正在尝试从C++访问Fortran公共块结构中的数组。

我有一个混合了C++和Fortran的示例代码。

Fortran:

代码语言:javascript
运行
复制
integer a(5),b  
common  /sample/ a,b  
a(1) = 1  
a(2) = 5  
a(3) = 10  
a(4) = 15  
a(5) = 20  
b = 25  

然后在C++中:

代码语言:javascript
运行
复制
extern "C"{  
    extern struct{  
        int *a,b;  
}sample_;  

在C++中,如果我尝试打印值sample_.b

代码语言:javascript
运行
复制
printf("sample b:%d\n",sample_.b);

我得到了a(2)的值:sample b:5

如果我尝试打印任何其他数组-a值,我只会得到一个分段错误...

代码语言:javascript
运行
复制
printf("sample_.a[1]=%d\n",(int)sample_.a[1]);  
printf("sample_.a[0]=%d\n",(int)sample_.a[0]);

我做错了什么?你知道吗?

我想,也许我也必须把数组"a“的长度传递给C++,但如果是这样的话,我也不知道该怎么做。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-07 20:36:16

我的Fortran有点(好吧,有点)生疏了,但让我试一试。

a可能收到了值,而不是指向它的指针。这会将其设置为1,这不是一个好的指针值。

b接收数据块中的第二个值。您的C++结构没有向编译器提供数据的真实格式,因此它只是按照结构中给出的顺序将项分配给结构。我会得到一个指向数据块的指针,然后手工反汇编它。

a赋给数据块的地址(看起来像一个long int指针;您的里程可能会有所不同)和b = a[5]。希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2012-05-08 06:32:15

如果你想在C和Fortran之间共享全局变量,最好的方法是使用模块变量和Fortran ISO_C_Binding。公共块是一个遗物,最好避免,除非是遗留代码的一部分。使用ISO_C_Binding将使您的代码编译器和平台独立。在gfortran手册的“混合语言编程”一章的“可互操作的全局变量”小节中有一个代码示例。这并不是特定于gfortran的,只是一些很好的文档。

继续使用ISO_C_Binding,如果您使用它提供的Fortran类型,您将确保与C类型匹配。相当于C的int的Fortran是C_INT。一个列表出现在gfortran手册的“内部模块”一章中。

票数 6
EN

Stack Overflow用户

发布于 2012-05-07 21:03:56

在我看来,您的FORTRAN数据实际上布局为

代码语言:javascript
运行
复制
struct {
  int a[5];
  int b;
}

你在一台机器上,sizeof(int) == sizeof(int*)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10481999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档