Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

343
Vistas
Pasar el puntero de Microsoft Visual C++ a Fortran y viceversa después de cambiar el código de 32 bits a 64 bits

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 END

Con 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 .

  • Convertir la dirección a big endian da 32758 -564428684
  • Convertir la dirección a little endian da -159449088 1954569182

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 END

Donde 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?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda