Estou com dificuldades para preencher um array de strings em um código C++. Aqui está o que tentei fazer:
principal.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]);
}
}
Depois de compilar os dois arquivos como
ifx -c main.f90
icx -c cpp_func.cpp
ifx main.o cpp_func.o
Recebo uma falha de segmentação. Você poderia me ajudar a imprimir array arr
corretamente dentro de main.f90
?
*** Editar ***
Qualquer solução que seja capaz de passar uma matriz de strings de C++ para Fortran seria apreciada.
Primeiro, você deve usar os recursos de vinculação C do Fortran para ter um código mais robusto:
Como você pode ver, a interface da rotina C é descrita. Em particular,
len
en
tem ovalue
atributo, porque C passa os objetos escalares por valor. Em relação ao array de caracteres, ele é descrito na interface como um array 1D plano de caracteres individuais, porque é assim que o lado C o vê com achar*
declaração.No lado C, você não tem muitas mudanças.
char*
em vez dechar**
, e&arr[i*len]
em vez dearr[i]
: para, para endereçar a i-ésima string do array Fortran, você tem que endereçar o (len*i)-ésimo caractere em C.