Domanda

Ho una raccolta di file .f e .h che truccano un codice fortran. Mi sto imbattendo nei guai Tyring per compilare i file .h. I file .h contengono un sacco di blocchi comuni. Un esempio di uno dei file .h è:

*AC HEAD      
c                                                                       HEAD 1
      common/blah/ x(25), y, z(25), p(25,mnv),                          HEAD 2
     1                t(25,mx), d(25,mnv)                               HEAD 3
c                                                                       HEAD 4
ETC...

Quando cerco una risposta su Google, si dice che i file .h siano file C/C ++, ma non sembrano essere scritti in C/C ++. Gfortran sembra anche pensare di essere file C.

Quando provo a compilare:

gfortran-4.5 -fdefault-real-8 -fbacktrace -fno-align-mmons head.h

Ottengo gli errori:

cc1: warning: command line option "-fdefault-real-8" is valid for Fortran but not for C
cc1: warning: command line option "-fbacktrace" is valid for Fortran but not for C
cc1: warning: command line option "-fno-align-commons" is valid for Fortran but not for C
HEAD.h:1:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘HEAD’

Ho provato a commentare la prima riga ' *AC Head', ma poi l'errore era cercare un attributo prima del *. Ho bisogno di qualcosa nell'ultima colonna con i valori # # per commentare così, devo costruire i file .h con un compilatore C ++ o cosa?

È stato utile?

Soluzione

Non li compili. Se grept gli altri file fortran, vedrai che sono inclusi usando qualcosa di simile include HEAD.h o "#include" head.h "" (quel secondo è la mia ipotesi; immagino che tu stia eseguendo il preprocessore C sui file fortran). Questi includono le dichiarazioni in sostanza lette in una copia di quel file .h ovunque l'istruzione include sia durante il processo di compilazione. Quindi è un pezzo di codice che viene usato, ma non ha mai compilato da solo.

Questa inclusione di file di intestazione in fortran è non Best practice, e tanto più perché sono abituati a distribuire ampiamente blocchi comuni attraverso il codice. Quindi non scrivere alcun nuovo codice usando questo approccio. Ma è quello che sta facendo questo particolare vecchio codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top