Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

338
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!