gpt4 book ai didi

c++ - 将 C++ 字符数组传递给 Fortran

转载 作者:行者123 更新时间:2023-11-30 01:47:46 25 4
gpt4 key购买 nike

我一直在尝试将字符数组从 C++ 传递到 Fortran 子例程,但 Fortran 似乎无法正确接收字符。我一直在网上搜索以找到解决方案,但提出的想法似乎太复杂了。史蒂夫在 Intel Fortran Forum 提出了一个有趣的(简洁的)解决方案。但我无法在我的代码中使用它。因此,我感谢任何帮助我解决此问题的建议。

以下函数是调用 fortran 子例程的 C++ 例程:

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

在 Debug模式下,当程序停在第 (i = 1) 行时,我将鼠标悬停在 file_name 上以查看其内容,但 Watch 窗口显示它找不到 file_name 符号(虽然 len 已正确传递)。此外,如果我在监 window 口中观看 file_name(1:8),我仍然没有得到原始字符数组。我认为我将参数传递给 Fortran 的方式有问题,但监 window 口可能不正确。

我感谢任何可以在这里阐明一些问题的帮助。谢谢

最佳答案

您掉进了一个陷阱,这是由于您说(即使在 Stack Overflow 上得到大量支持的答案)您应该使用 ISO C 绑定(bind)来构建可互操作的子例程。

这是错误的,使用 iso_c_binding 模块不会使过程互操作,也不会更改调用约定。

Fortran 2003 与 C 的互操作性中另一个独立且同样重要的特性是 bind(C) 属性。

请注意,Steve Lionel 在链接示例中有它。你应该有

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

bind(C) 以几种微妙的方式改变了调用约定,最大的区别是字符串,它通常在隐藏参数中传递长度,但在可互操作的过程中不传递。

关于c++ - 将 C++ 字符数组传递给 Fortran,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31175412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com