c arrays fortran fortran-iso-c-binding

Pasando una matriz bidimensional de Fortran a C



arrays fortran-iso-c-binding (2)

Después de investigar más pude encontrar un trabajo alrededor de esto de la siguiente manera:

La siguiente es mi función C:

#include <stdio.h> void print2(void *p, int n) { printf("Array from C is /n"); double *dptr; dptr = (double *)p; for (int i = 0; i < n; i++) { for (int j = 0; j<n; j++) printf("%.6g /t",dptr[i*n+j]); printf("/n"); } }

El siguiente es mi código Fortran:

program linkFwithC use iso_c_binding implicit none interface subroutine my_routine(p,r) bind(c,name=''print2'') import :: c_ptr import :: c_int type(c_ptr), value :: p integer(c_int), value :: r end subroutine end interface integer,parameter ::n=3 real (c_double), allocatable, target :: xyz(:,:) real (c_double), target :: abc(3,3) type(c_ptr) :: cptr allocate(xyz(n,n)) cptr = c_loc(xyz(1,1)) !Inputing array valyes xyz(1,1)= 1 xyz(1,2)= 2 xyz(1,3)= 3 xyz(2,1)= 4 xyz(2,2)= 5 xyz(2,3)= 6 xyz(3,1)= 7 xyz(3,2)= 8 xyz(3,3)= 9 call my_routine(cptr,n) deallocate(xyz) pause end program linkFwithC

Tengo problemas para pasar una matriz bidimensional de Fortran a C. La siguiente es mi función C, que solo muestra los elementos de la matriz en la pantalla.

#include <stdio.h> void print2(double *arr , int *n) { int y = *n; printf("/n y = %d", y); for(int i =0; i<y; i++) { for (int j = 0; j < y; j++) printf("%.6g", *((arr + i*y) + j)); printf("/n"); } }

Mi código Fortran hasta ahora es el siguiente:

program linkFwithC use, intrinsic :: iso_c_binding implicit none real, dimension(3,3)::a a(1,1)=1 a(1,2)=2 a(1,3)=3 a(2,1)=4 a(2,2)=5 a(2,3)=6 a(3,1)=7 a(3,2)=8 a(3,3)=9 interface subroutine print2(a,n) bind( c ) use, intrinsic :: iso_c_binding type(c_ptr)::a integer(C_INT)::n end subroutine print2 end interface call print2(c_loc(a),3) end program linkFwithC

La forma en que estoy vinculando ambos archivos es creando una biblioteca estática para la función C y compilando el archivo .lib. Una vez que se construye el archivo .lib, lo agrego al proyecto fortran y ejecuto el proyecto fortran. El código se ejecuta sin errores y el valor n se muestra correctamente; Sin embargo, los valores de matriz mostrados son todos incorrectos.

Por favor ayuda !

Gracias, Anas


Hay algunos problemas en el código como [actualmente] se muestra.

  • El argumento n en la interfaz de Fortran para print2 no tiene el atributo VALOR, pero el parámetro correspondiente en la función C se toma por valor. Considere agregar VALOR a la declaración Fortran.

  • El mismo problema surge con el puntero a la matriz. La interfaz Fortran pasa un puntero sin valor, la función C espera un "puntero por valor" (en lugar de un puntero a un puntero). Tenga en cuenta que no es necesario utilizar explícitamente un C_PTR aquí; puede construir una interfaz interoperable utilizando el tipo real de la matriz.

  • En la mayoría de las plataformas, un valor predeterminado de Fortran no es lo mismo que un doble de C: considere usar las constantes de tipo de ISO_C_BINDING para asegurarse de que el tipo de REAL en el lado de Fortran coincida con el de C.

  • C_LOC requiere su argumento para tener el atributo TARGET. Agregue ese atributo a la declaración de la variable en el programa principal.