Ich versuche, ein Array von C/C++ in ein Fortran 2003-Modul zu übergeben und die berechneten Werte zurück in C/C++ zu erhalten. Ich konnte einzelne Werte (Skalare) übergeben und zurückgeben, aber es ist schwierig, ein Array hin und her zu bekommen. Ich habe viele Threads zu skalaren Werten gefunden, und ich bin erfolgreich darin gewesen, diese zu arbeiten.Übergeben Sie Arrays von C/C++ zu Fortran und geben Sie ein berechnetes Array zurück
Ich habe meine Array-basierten Funktionen nach meiner Arbeit skalare Funktionen modelliert.
Ich benutze gcc/gfortran.
Hier ist das Fortran-Modul (ConvertUnitsLib.f03).
module ConvertUnitsLib
use :: iso_c_binding ! for C/C++ interop
real(c_double), bind(c) :: degF, degC
public DegCtoF
contains
!
! Convert temperature degrees Celsius Fahrenheit
!
real(kind = c_double) function DegCtoF(degC) result(degF) &
& bind(c, name = "DegCtoF")
real(c_double), intent(in), dimension(:) :: degC
real(c_double), dimension(size(degC)) :: degF
do i = 1, size(degC)
degF(i) = (degC(i) * 1.8) + 32
end do
end function DegCtoF
! End of module
end module ConvertUnitsLib
Und die C/C++, (CFort.cpp)
#include <stdio.h>
#ifdef __cplusplus
extern"C" {
#endif
double DegCtoF(double *[]);
#ifdef __cplusplus
}
#endif
/**********************************************************************/
int main(int argc, char *argv[])
{
printf("C/C++ and Fortran together!\n");
double DegreesC[2] = {32, 64};
double DegreesF[2];
DegreesF = DegCtoF(&DegreesC);
printf("%3.1f [C] = %3.1f [F]\n", DegreesC, DegreesF);
return 0;
}
Und last but not least, das Makefile
# C++ directives
CC=g++
CFLAGS=-std=c++11
# Fortran directives
FC=gfortran
FFLAGS=-std=f2003
all: clean
$(FC) $(FFLAGS) -c -fcheck=all ConvertUnitsLib.f03
$(CC) $(CFLAGS) -c CFort.cpp
$(FC) $(FFLAGS) ConvertUnitsLib.o CFort.o -o convert
clean:
rm -f *.o
rm -f *.mod
Nun, ich bin nicht sicher über Fortran, aber in C und C++, übergibt ein Array (das tatsächlich die Adresse des ersten Elements übergibt) alle Größeninformationen, so dass Ihre Fortran Routine nichts über die tatsächliche Anzahl der Elemente weiß Das Array enthält. Ich würde zwei Parameter erwarten, das Array (oder Zeiger auf den Puffer) und die Anzahl der Elemente. – PaulMcKenzie
Von deinen Tags gehe ich davon aus, dass du gfortran/gcc verwendest, aber kannst du das bestätigen? Das Übernehmen eines angenommenen Formarguments wie "degC" gehört nicht zur Interoperabilität von Fortran 2003 C und erfordert viel mehr Aufwand. Der Aspekt, von dem derzeit erwartet wird, dass er Bestandteil von F2015 (der ISO TS) ist, wird von gcc nicht unterstützt. Wenn keine solche Unterstützung vorhanden ist, verwenden Sie den Kommentar von @PaulMcKenzie und verwenden Sie ein explizites Shape-Array, dessen Größe ebenfalls übergeben wurde. – francescalus
@francescalus, Ja, ich benutze gfortran/gcc. Wenn Sie mehr Aufwand bedeuten, muss ich auch die Größe des Arrays übergeben? Ich weiß, wenn C die Fortran-Funktion aufruft, übergibt es die Skalarwerte mit einem Zeiger. Muss ich nur die Größe auch überschreiten, und dann kann es (Fortran) den Rest ausmachen? –