繁体   English   中英

从 C++ 到 fortran 数组的访问冲突

[英]access violation from C++ to fortran array

我正在开发一个 C++-fortran 混合编译项目。 在 fortran 方面,我编写了一个接口来隔离 C++ 引用/指向 fortran 变量的指针。 在 fortran 子例程完成它们的工作后,接口会将值一一分配给 C++ 数组。 回到 C++ 端时出现问题。 我可以在 C++ 调试器中看到每个数组元素的值,但是当我使用 std::cout<<arr[0]<<std::endl 时,它给了我访问错误:

Exception thrown at 0x79762B8E (msvcp140d.dll) in TEST_IO.exe: 0xC0000005: Access violation reading location 0x9C6D0014

我写了一个简化的测试代码:

#include <iostream>
extern "C" {void fort_interface(<typeName1> &par1,<typename2> *par2,....,<typeName> *output);}
int main()
{
..... //setup input parameters
float *arr = new float[N_arr]; //N_arr is big enough.

float check = 12321;
std::cout<<check<<std::endl;
/*the float variable check is independent from fort_interface, just to check the memory status*/

fort_interface(par1, par2,...,arr);

std::cout<<check<<std::endl;//exception occurs!
}

即使我打印出与 fort_interface() 无关的“检查”,也会报告相同的异常。 同时在调试器中“check”的值为12321。

我写了另一个玩具 fortran-C++ 代码来测试 fortran 如何使用指针/引用,一切顺利。 可以打印值,析构函数也可以很好地工作。

抱歉,我无法在此处上传 fortran-C++ 接口,因为它包含 100 多个参数(这就是我编写此接口以使用外部参数保持 fortran 原始代码完整的原因。)我只想知道为什么我可以在调试器中看到该值但它无法访问? 谢谢您的帮助!


更新:问题解决了! 我传递了一个指向 fortran 子例程的指针,这导致了段错误。 fortran-C 混合编译设置没有错。 只是因为段错误。 再次感谢大家!

由于我看不到您的 Fortran-C++ 接口,因此我猜测可能会有所帮助。

在 fortran 中处理数组时,它们在内存中保存为列,而 C/C++ 将它们保存为行。 这使得这两种语言之间的接口变得棘手。

例如,如果您有 arr[5][5] 并在 C 中调用元素 arr[1][0],编译器将获取第 1 行并将其保存在缓存中,而 fortran 编译器将获取第 0 列并将其保存在您的缓存中。

我希望这有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM