我正在努力在 C++ 代码中填充字符串数组。这是我尝试做的:
main.f90:
program main
implicit none
character(len=100) arr(3)
call get_string_array(arr, 100, 3)
write(*,'(3(a,3x))') arr
end
cpp_func.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 绑定功能,以获得更健壮的代码:
program main
use iso_c_binding
implicit none
character(len=100) arr(3)
interface get_string_array
subroutine get_string_array(a, len, n) bind(C)
import c_int, c_char
integer(c_int), value :: len, n
character(kind=c_char,len=1) :: a(*)
end subroutine
end interface
call get_string_array(arr, 100, 3)
write(*,'(a)') arr
end
如您所见,描述了 C 例程的接口。特别是,
len
和 n
具有 value
属性,因为 C 按值传递标量对象。关于字符数组,它在界面中被描述为单个字符的平面一维数组,因为这就是 C 端通过 char*
声明看到的方式。
C 端没有太多变化。
char*
代替 char**
,&arr[i*len]
代替 arr[i]
:因为,要寻址 Fortran 数组的第 i 个字符串,您必须寻址 C 中的第 (len*i) 个字符。
#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], (size_t)len, strings[i]);
}
}
}