Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

340
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda