子程序C++;从Fortran调用:如何处理动态内存分配? 我现在有一个C++程序,它执行一些任务(这里不重要),并将一些数据存储到一个动态分配的2D数组中(使用C函数Maloc)。它运行良好,我现在需要在fortran程序中访问这些数据。我目前正在用Fortran创建一个程序,它在C/C++中调用一个子例程,执行我想要的任务,但是当2D动态数组充满数据时,我需要在返回Fortran主程序时访问它。 问题是我无法将数据返回到Fortran主程序(在2D可分配数组中) 我试着编写一个简单的程序,用于传递分配在C子程序中的动态数组,该数组由我的主要Fortran程序调用,以便查看当我离开C子程序时是否可以访问数据

子程序C++;从Fortran调用:如何处理动态内存分配? 我现在有一个C++程序,它执行一些任务(这里不重要),并将一些数据存储到一个动态分配的2D数组中(使用C函数Maloc)。它运行良好,我现在需要在fortran程序中访问这些数据。我目前正在用Fortran创建一个程序,它在C/C++中调用一个子例程,执行我想要的任务,但是当2D动态数组充满数据时,我需要在返回Fortran主程序时访问它。 问题是我无法将数据返回到Fortran主程序(在2D可分配数组中) 我试着编写一个简单的程序,用于传递分配在C子程序中的动态数组,该数组由我的主要Fortran程序调用,以便查看当我离开C子程序时是否可以访问数据,c++,arrays,memory-management,fortran,C++,Arrays,Memory Management,Fortran,以下是我的小代码: Fortran main: 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 subrouti

以下是我的小代码:

Fortran main:

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
#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
C子例程:

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
#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
我不明白为什么我>1时会得到这个 我希望我清楚我的问题,有人能帮忙吗


非常感谢

您的问题是
*x[i]=i
*(x[i])=i(*x)[i]=i

这是因为
x[i]
*x
都是指向
int
的指针,因此编译器无法捕获错误。
*x[i]
相当于
x[i][0]
,而
(*x[i]
相当于
x[0][i]

为了避免问题和括号,您可以这样重写:

void call_fc_(int **x, int s)
{
    int i;
    int *y = (int *) malloc(sizeof(int)*s);
    for(i = 0; i < 100 && i < s; i++)
    {
        cout << i << endl;
        y[i]=i;
    }
    *x = y;
}
void call\u fc(int**x,int s)
{
int i;
int*y=(int*)malloc(sizeof(int)*s);
对于(i=0;i<100&&iCUT< P>除此之外,C++中FORTRAN中的接口声明PX参数是可分配的。注意支持这一点需要一个支持将来F201X标准的特性的编译器。
<>我很怀疑这不是你想要的——但是如果你做C++的声明声明和你的有很大的不同,请参阅TS以获得更多的与C的互操作性。
您不需要或希望px是可分配的,也可以是主程序或参数中的变量。您不是“分配”px——它是一个CU-PTR,您想用C++函数分配的一些内存的C地址定义。

另外,接口中的
s
参数是在没有VALUE属性的情况下声明的。这意味着它对应于C端的指针参数。您的C定义显示它是通过值传递的。

非常感谢,事实上segfult不再出现了,这很棘手!但我现在有另一个问题,似乎我可以访问lar我显示了整个代码(它很小),因为我还执行了一些更改(例如put*s而不是s)和输出。Fortran:PROGRAM FORT_C使用iso_C_binding隐式无接口子例程call_fc(pX,s)bind(C,name='call_fc_')import integer(c_int)::s type(c_ptr),allocatable::pX end子例程end interface integer(c_int)::i integer(c_int)::s integer(c_int),pointer::X(:)type(c_ptr),allocatable::pX s=100 call call_fc(pX,s)call c_f_指针(pX,X,(/s/)ENDC子例程:#include#include使用命名空间std;extern“C”{void call_fc(int x,int*s);void C_func_deallocate(int**x)}void call_fc(int**x,int*s){int*y=(int*)malloc sizeof(int)*(*s));for(int i=0;i<*s+10;i++){当我试图访问分配的空间时,我想得到一个segfault,但它似乎没有干扰它…为什么?再次感谢你的回答,这非常有用!很抱歉评论的形状,我只是无法作为一个普通用户在接下来的8小时内发布答案…感谢你回答IanH,关于
s
参数,我更正了它(如前面的注释所述)。关于pX,我将“可分配”更改为“指针”(在前面的注释中也提到了,很抱歉注释中的代码结构,我没有其他选择).我对混合这两种语言非常陌生,所以如果我写的东西是假的,我很抱歉!我想用Fortran声明的是一种指针,可以访问C子程序中分配的数组。你知道怎么做吗?一种“指针”在Fortran中,与C中的指针相同的只是一个C_PTR-您不希望在接口体中的伪参数上有指针属性。Fortran指针是“不同的”以几种方式转换C指针-这就是为什么您使用C_F_指针将Fortran中的C指针转换为Fortran指针。我删除了指针属性,现在它工作正常。我开始了解如何在混合Fortran和C时处理动态内存。感谢您的帮助!