将字符串数组从 C++ 函数返回到 Fortran

问题描述 投票:0回答:1

我正在努力在 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 的解决方案都将受到赞赏。

c++ arrays string fortran language-interoperability
1个回答
0
投票

首先,您应该使用 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]);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.