我想知道将数组从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;
}
答案 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;
}
。这意味着您必须传递一个指向数组指针的指针,以便能够修改数组指针。