Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过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 - Fatal编程技术网

通过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&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(

下面是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\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)
以几种微妙的方式更改调用约定,最大的区别在于字符串,字符串通常在隐藏参数中传递长度,但在可互操作的过程中不传递长度