使用C_LOC()将指向1D Fortran数组的指针传递给C ++会导致垃圾值

时间:2017-07-27 04:25:22

标签: c++ arrays pointers fortran fortran-iso-c-binding

我想知道将数组从Fortran传递给C的正确方法。它返回iso_c_binding只有C_F_pointer但没有F_C_pointer。我尝试使用c_loc,但是第二个元素得到-6.04639e-264。

我的Fortran代码是:

SUBROUTINE SIMULATION(ARRAY) BIND(C)
    USE ISO_C_BINDING
    IMPLICIT NONE

    TYPE (c_ptr), INTENT(INOUT) :: ARRAY
    REAL (C_DOUBLE), TARGET, SAVE :: ETA(0:1)

    ! Allocate an array and make it available in C
    ARRAY = C_LOC(ETA)
    ETA(0) = 1.0
    ETA(1) = 2.0

END SUBROUTINE SIMULATION

我的C ++代码是:

#include <iostream>
#include <vector>
using namespace std;

extern "C" {
    void simulation(double* array[]);
}
int main()
{
    double* array[2];
    simulation(array);
    cout << *array[0] << endl;
    cout << *array[1] << endl;

    return 0;
}

1 个答案:

答案 0 :(得分:0)

我很确定你的C ++代码中的指针存在问题。 Fortran代码是正确的。

这很有效:

B

带有指向固定大小数组的指针的版本最后是

D

对我个人来说,这是非常困难和令人困惑的语法,在正确的组合中有太多的*和[]。一些typedef可能会简化它。也许:

extern "C" {
    void simulation(double  **array);
}
int main()
{
    double *array = NULL;
    simulation(&array);
    cout << array[0] << endl;
    cout << array[1] << endl;

    return 0;
}

注意,与所有三种情况都有extern "C" { void simulation(double (**array)[2]); } int main() { double (*array)[2] = NULL; simulation(&array); cout << (*array)[0] << endl; cout << (*array)[1] << endl; return 0; } 。这意味着您必须传递一个指向数组指针的指针,以便能够修改数组指针。