通过C&x2B+;Fortran中的字符数组 我一直试图把字符数组从C++传递到FORTRAN子程序,但好像Fortran没有正确接收字符。我一直在网上寻找解决方案,但提出的想法似乎太复杂了。一个有趣的(简洁的)解决方案是由Steve at提出的,但我无法在我的代码中使用它。因此,我非常感谢任何帮助我解决这个问题的建议 以下函数是我的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子程序,它应该接收字符数组:通过C&x2B+;Fortran中的字符数组 我一直试图把字符数组从C++传递到FORTRAN子程序,但好像Fortran没有正确接收字符。我一直在网上寻找解决方案,但提出的想法似乎太复杂了。一个有趣的(简洁的)解决方案是由Steve at提出的,但我无法在我的代码中使用它。因此,我非常感谢任何帮助我解决这个问题的建议 以下函数是我的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); },c++,fortran,character,parameter-passing,C++,Fortran,Character,Parameter Passing,下面是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(
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\u name
上查看其内容,但监视窗口显示它找不到file\u name
符号(尽管len
已正确传递)。此外,如果我在监视窗口中监视文件名(1:8)
,仍然无法获得原始字符数组。我相信我将参数传递给Fortran的方式有问题,但很可能是监视窗口不正确
我很感激任何能给我们带来启示的帮助。
多亏了您掉进了陷阱,这是因为您说(即使是在严重上浮的答案中出现堆栈溢出),您应该使用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)
以几种微妙的方式改变了调用约定,最大的区别在于字符串,它通常在隐藏参数中传递长度,但在可互操作的过程中不传递长度。您落入了由say引起的陷阱(即使在严重上浮的答案中出现堆栈溢出)您应该使用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)
以几种微妙的方式更改调用约定,最大的区别在于字符串,字符串通常在隐藏参数中传递长度,但在可互操作的过程中不传递长度