【发布时间】:2014-05-07 11:30:20
【问题描述】:
我目前有一个 C++ 程序,它执行一些任务(这里不重要)并将一些数据存储到一个动态分配的二维数组中(使用 C 函数 malloc)。它运行良好,我现在需要在 fortran 程序中访问这些数据。我目前正在 Fortran 中创建一个程序,它调用 C/C++ 中的子例程来执行我想要的任务,但是当 2D 动态数组充满数据时,我需要在返回 Fortran 主程序时访问它。 问题是我无法将数据返回到 Fortran 主程序(在 2D 可分配数组中) 我尝试编写一个简单的程序来传递在 C 子程序中分配的动态数组,该子程序由我的主 Fortran 程序调用,以便查看当我退出 C 子程序时是否可以访问数据。
这是我的小代码:
Fortran 主程序:
PROGRAM FORT_C
use iso_c_binding
IMPLICIT NONE
interface
subroutine call_fc(pX,s) bind(C,name='call_fc_')
import
integer(c_int) :: s
type(c_ptr), allocatable :: pX
end subroutine
end interface
integer(c_int) :: i
integer(c_int), pointer :: X(:)
type(C_ptr), allocatable :: pX
call call_fc(pX,100)
call c_f_pointer(pX,X,[100])
END
C 子程序:
#include <cstdlib>
#include <iostream>
using namespace std;
extern "C"
{
void call_fc_(int **x, int s);
void c_func_deallocate(int **x);
}
void call_fc_(int **x, int s)
{
int i;
*x = (int *) malloc(sizeof(int)*s);
for(i=0;i<100;i++)
{
cout << i << endl;
*x[i]=i;
}
}
void c_func_deallocate(int **x)
{
free(*x);
}
这真的很简单,但我得到了这个输出:
0
1
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
exemple 000000000040304C Unknown Unknown Unknown
exemple 0000000000402F25 Unknown Unknown Unknown
exemple 0000000000402ECC Unknown Unknown Unknown
libc.so.6 000000331241ECDD Unknown Unknown Unknown
exemple 0000000000402DC9 Unknown Unknown Unknown
我不明白为什么我在 i>1 时得到这个 我希望我清楚我的问题,有人可以帮忙吗?
非常感谢!
【问题讨论】:
标签: c++ arrays memory-management fortran