gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:58:40 25 4
gpt4 key购买 nike

我想知道将数组从 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;
}

最佳答案

我很确定这是您的 C++ 代码中指针的问题。 Fortran 代码是正确的。

这很好用:

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;
}

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

typedef double (*array2)[2];

extern "C" {
void simulation(array2* array);
}

int main()
{
array2 array;
simulation(&array);
cout << (*array)[0] << endl;
cout << (*array)[1] << endl;

return 0;
}

注意,在所有三种情况下都有 simulation(&array);。这意味着您必须将指针传递给数组指针才能修改数组指针。

关于c++ - 使用 C_LOC() 将指向一维 Fortran 数组的指针传递给 C++ 会导致垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45341399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com