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.