En Fortran se llama una función C (compilada en Visual Studio 64 bit):
SUBROUTINE GET_PNTR INTEGER*8 NXLOC(41) REAL*4 WRX25I(41) NXLOC(1) = IVRLOC( WRX25I(1) ) RETURN ENDCon la función C definida como:
long long IVRLOC(var) void *var; { return var; } Cuando me detengo en la declaración de devolución, var se define como FORTRAN_X64.exe!0x00007ff6de5b8074 .
Cuando salgo de la función, solo se muestran los últimos 4 bytes (-564428684 en este caso) del big endian para el valor de NXLOC(1). No estoy seguro de si esto es correcto o no, pero parece que no puede ser y dado que el siguiente paso para usar la dirección falla, parece que es incorrecta. Al buscar en la web, parece que el valor debería ser little endian, pero eso no es lo que estoy viendo.
¿Qué está pasando?
El siguiente paso en el código Fortran, cuando se usa la dirección, se ve así:
PROGRAM USE_PTR INTEGER*8 NXLOC(41) REAL*4 XSLAM(41) NX = 41 CALL VALOCX(NXLOC(1),XSLAM(1),NX) RETURN ENDDonde la función C se ve así:
void VALOCX( nsloc, vals, ns) float *nsloc[], vals[]; int *ns; { int i; for (i=0; i<*ns; i++) { vals[i] = *nsloc[i]; } } nsloc en esta función ahora tiene el valor 0x00007ff6de5b3c00 {FORTRAN_X64.exe!CHKSUB} {0xffffffffde5b8074 {???}} donde solo se recuperan los últimos cuatro bytes de la dirección variable original. Supongo que necesito convertir de big endian a little endian en algún momento, pero mis esfuerzos hasta ahora solo parecen aumentar mi confusión.
¿Por qué "var" no se convierte al valor correcto al salir de IVRLOC para que vuelva a convertirse al valor correcto en VALOCX?
Si no está declarando IVRLOC como una función que devuelve INTEGER*8 (o quizás INTEGER(c_intptr_t) ) en el lado de Fortran, es del tipo entero predeterminado que probablemente será un entero de 4 bytes. Lo que podría explicar que la mitad del valor original de 8 bytes se establezca en cero debido a la falta de coincidencia de tipos.