[英]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.