2015-07-02 173 views
0

我一直試圖從C++傳遞一個字符數組到Fortran子例程,但它好像Fortran沒有正確接收字符。我一直在尋找網絡尋找解決方案,但提出的想法似乎太複雜了。 Steve在Intel Fortran Forum提出了一個有趣(簡潔)的解決方案,但是我無法在我的代碼中使用它。所以,我感謝任何建議,幫助我解決這個問題。將C++字符數組傳遞給Fortran

下面的函數是我的C++程序,使調用FORTRAN子程序:

extern "C" void __stdcall F_VALIDATE_XML(const char* buffer, int len); 
void CUDMEditorDoc::OnValidateXML() 
{ 
    CString fileName = "test.udm"; 
    const char* buffer = fileName.GetBuffer(); 
    int len = fileName.GetLength(); 
    F_VALIDATE_XML(buffer, len); 
} 

這裏是一個應該接收字符數組的Fortran子程序:

subroutine validate_xml(file_name, len) 
!DEC$ ATTRIBUTES DECORATE, STDCALL, ALIAS:"F_VALIDATE_XML" :: validate_xml 

use xml_reader_structure 
use, intrinsic :: ISO_C_Binding 

integer(C_INT), value, intent(in) :: len 
character(len, kind=C_CHAR), intent(in) :: file_name 

integer :: i 
i = 1 
end subroutine validate_xml 

在調試模式和當程序停在行(i = 1)時,我將鼠標懸停在file_name上查看其內容,但Watch窗口顯示它找不到file_name符號(儘管len是corr實際通過)。另外,如果我在觀看窗口中觀看file_name(1:8),我仍然沒有得到原始字符數組。我相信將參數傳遞給Fortran的方式有些問題,但觀察窗口的機會不正確。

我很感激任何幫助,可以在這裏擺脫一些燈。 謝謝

回答

3

你陷入了陷阱,這是由於說(即使堆棧溢出在嚴重問題的答案中),你應該使用ISO C綁定來構造可互操作的子例程。

這是錯誤的,使用iso_c_binding模塊不會使程序互操作並且不會改變調用約定。

Fortran 2003到C互操作性中另一個獨立且同等重要的特性是bind(C)屬性。

請注意,Steve Lionel在鏈接的例子中有它。你應該有

subroutine validate_xml(file_name, len) bind(C, name="F_VALIDATE_XML") 

bind(C)改變調用約定在幾個微妙的方式和最大的區別是字符串,通常通過長度在一個隱藏的參數,但不能在互操作的程序。