Newsgroup: it.comp.lang.c
Titolo: Chiamare subroutine in FORTRAN da C

Salve a tutti,
utilizzo gcc e f77 su UNIX, ed ho bisogno di usare delle subroutine
scritte in FORTRAN chiamandole da C. 
Vorrei evitare l'utilizzo di un programma di conversione del sorgente da
FORTRAN in C (tipo f2c) per i sorgenti in FORTRAN.
Qualcuno sa se esista un modo per linkare direttamente assieme i vari
object files (librerie di interfacciamento o simili)?
Grazie in anticipo,
Michele
--
Posted from 
summer4.Stanford.EDU
 [171.64.116.194]
via Mailgate.ORG Server - 
http://www.mailgate.org

object files (librerie di interfacciamento o simili)?
Non occorre nessuna "libreria di interfacciamento", basta
riprodurre in C il "vero nome" e convenzione di chiamata del
Fortran, che varia a seconda della piattaforma e del compilatore
Fortran che si usa.  A suo tempo, quando qui usavamo Fortran,
avevo sviluppato una libreria di macro usabili da C per chiamare
(e farsi chiamare) da Fortran in modo "portabile" fra le varie
piattaforme (una dozzina di Unix diversi, piu' VMS, Dos, ecc),
ma se a te interessa una piattaforma sola puoi cavartela in
modo piu' semplice.
In generale il nome (case-insensitive) della routine Fortran e'
reso in minuscolo in C; una meta' circa dei compilatori Fortran
appone un carattere di sottolineatura (_) dopo il nome della
routine, un'altra meta' invece la lascia non-decorata (usando
nm sui file .o generato dal tuo compilatore Fortran, e' molto
facile determinare questo).  I parametri in Fortran sono sempre
passati per indirizzo, quindi in C dovrai vederli come puntatori.
Una _subroutine_ Fortran e' normalmente resa in C come una
function che ritorna int: il ritorno 0 indica "uscita normale", i
vari ritorni 1, 2, ..., equivalgono a varie possibili uscite di errore
(istruzioni tipo RETURN 2 del Fortran).
I CHARACTER Fortran sono il singolo elemento piu' complesso
nella chiamata da C, un po' ogni compilatore Fortran fa a modo
suo.  Forse la singola soluzione piu' popolare: il puntatore al
buffer di caratteri e' passato come char* nella normale sequenza
di argomenti, PIU', un long che indica la lunghezza del buffer e'
passato PER VALORE alla fine della normale sequenza -- se vi
sono piu' parametri CHARACTER*(qualcosa), le varie lunghezze
sono passate in questo modo l'una dopo l'altra.
Altre complicazioni si hanno sui LOGICAL di lunghezza non
precisata (1, 2, o 4 byte secondo i compilatori; .TRUE. e' poi
rappresentato come 1, -1, o altro ancora, mentre .FALSE. e'
quasi sempre rappresentato come 0), sui puntatori a funzione,
e pochi altri dettagli.
Se le tue routine Fortran non hanno return alternativi, CHARACTER,
LOGICAL, puntatori a subroutine, ecc, avrai la vita abbastanza
semplice.  In alcuni casi puo' essere necessario che il programma
principale sia scritto in Fortran per inizializzare correttamente i
sottosistemi di I/O, se le routine Fortran devono fare qualche tipo
di I/O (purtroppo alcuni sistemi C hanno a loro volta vincoli
analoghi, e li' diventa problematico linkare routine Fortran e
routine C se _entrambe_ devono fare I/O ognuna per conto
proprio... noi risolvemmo il problema "sradicando" tutto l'I/O
nativo Fortran e sostituendolo con chiamate a funzioni apposite
scritte in C, in modo che tutto il "vero I/O" avvenisse da C).
Mi pare che sia tutto... buon lavoro e buona fortuna!
Alex