将C++字符数组传递给Fortran
Passing C++ character array to Fortran
我一直试图将一个字符数组从C++传递到Fortran子例程,但Fortran似乎无法正确接收字符。我一直在网上寻找解决方案,但提出的想法似乎太复杂了。Steve在"英特尔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
上以查看其内容,但"监视"窗口显示它找不到file_name
符号(尽管len
已正确传递)。此外,如果我在观察窗口中观察file_name(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)
以几种微妙的方式更改了调用约定,最大的区别是字符串,它们通常在隐藏参数中传递长度,但在可互操作的过程中不传递。
相关文章:
- 将指向 1D Fortran 数组的指针传递给使用 C_LOC() 进行C++会导致垃圾值
- 将分配给C++数组传递给 Fortran 子例程
- 通过矢量下标访问 Fortran 数组,相当于 cpp
- 将数组从 Fortran 传递到C++时未定义的引用
- 将字符串数组从fortran传递到C/C DLL,并获取具有更改值的数组
- 将fortran生成的二进制文件读取到C++中的带符号整数数组中
- 如何将字符串数组从C和Fortran传递到Fortran
- 在C++和Fortran代码之间传递复数数组
- 为什么值放置在 fortran 函数的数组中,而在调用 c++ 函数中不存在
- C++是否有类似于 Fortran 冒号 A[2][:] 的数组占位符?
- 将 char 数组从 C++ 传递到 Fortran
- 将数组从C/C++传递给Fortran,并返回一个计算的数组
- 将C++数组传递给Fortran子例程会导致nan值出现在结果中
- C++中Fortran风格的多维数组
- 为fortran程序员在c++中传递多维数组
- 将数组从fortran传递给c++函数
- 从传入的FORTRAN数组生成CUSP coo_matrix
- 将C++字符数组传递给Fortran
- 如何使用SWIG将Fortran有序的2d numpy数组传递到c ++中
- Fortran 将字符*81 数组传递给 C/C++ 代码