我正在努力用 C++ 代码填充字符串数组。以下是我尝试做的:
主要.f90:
program main
implicit none
character(len=100) arr(3)
call get_string_array(arr, 100, 3)
write(*,'(3(a,3x))') arr
end
cpp_函数.cpp:
#include <cstring>
#include <algorithm>
using namespace std;
void ConvertToFortran(char* fstring, size_t fstring_len, const char* cstring)
{
size_t inlen = strlen(cstring);
size_t cpylen = min(inlen, fstring_len);
fill(fstring, fstring + fstring_len, ' ');
copy(cstring, cstring + cpylen, fstring);
}
extern "C"
{
void get_string_array_(char** arr, int len, int n)
{
const char* strings[] = {"duma1", "duma2", "duma3"};
for (int i = 0; i < n; i++)
ConvertToFortran(arr[i], len, strings[i]);
}
}
编译这两个文件后
ifx -c main.f90
icx -c cpp_func.cpp
ifx main.o cpp_func.o
我收到分段错误。您能帮我如何arr
在其中正确打印数组main.f90
吗?
*** 编辑 ***
任何能够将字符串数组从 C++ 传递到 Fortran 的解决方案都将受到赞赏。
首先,您应该使用 Fortran 的 C 绑定功能来获得更为健壮的代码:
如您所见,描述了 C 例程的接口。特别是,
len
和n
具有value
属性,因为 C 通过值传递标量对象。关于字符数组,它在接口中被描述为单个字符的平面 1D 数组,因为这是 C 端通过声明看到它的方式char*
。在 C 方面,您没有太多的变化。
char*
而不是char**
,并且&arr[i*len]
而不是arr[i]
:对于,为了寻址 Fortran 数组的第 i 个字符串,您必须寻址 C 中的第 (len*i) 个字符。