我正在尝试从C++访问Fortran公共块结构中的数组。
我有一个混合了C++和Fortran的示例代码。
Fortran:
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++中:
extern "C"{
extern struct{
int *a,b;
}sample_; 在C++中,如果我尝试打印值sample_.b:
printf("sample b:%d\n",sample_.b);我得到了a(2)的值:sample b:5
如果我尝试打印任何其他数组-a值,我只会得到一个分段错误...
printf("sample_.a[1]=%d\n",(int)sample_.a[1]);
printf("sample_.a[0]=%d\n",(int)sample_.a[0]);我做错了什么?你知道吗?
我想,也许我也必须把数组"a“的长度传递给C++,但如果是这样的话,我也不知道该怎么做。
发布于 2012-05-07 20:36:16
我的Fortran有点(好吧,有点)生疏了,但让我试一试。
a可能收到了值,而不是指向它的指针。这会将其设置为1,这不是一个好的指针值。
b接收数据块中的第二个值。您的C++结构没有向编译器提供数据的真实格式,因此它只是按照结构中给出的顺序将项分配给结构。我会得到一个指向数据块的指针,然后手工反汇编它。
将a赋给数据块的地址(看起来像一个long int指针;您的里程可能会有所不同)和b = a[5]。希望这能有所帮助。
发布于 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手册的“内部模块”一章中。
发布于 2012-05-07 21:03:56
在我看来,您的FORTRAN数据实际上布局为
struct {
int a[5];
int b;
}你在一台机器上,sizeof(int) == sizeof(int*)。
https://stackoverflow.com/questions/10481999
复制相似问题