Alcuni dei programmi elencati nel cap. 1.5 sono scritti in FORTRAN, e l'interfaccia C-FORTRAN non prevede funzioni che riportano l'indirizzo di una struttura (record in terminologia FORTRAN), o di una stringa di caratteri. In un caso (programma correct) il programma è stato riscritto interamente in C, in quanto le modifiche da effettuare erano comunque numerose, ma per altri (toolxdir, corrlsr, toolas) le modifiche richieste sono minime, e non giustificano una trascrizione.
La soluzione al problema consiste nello scrivere una serie di funzioni in C che richiedano argomenti compatibili con l'interfaccia FORTRAN, e non ritornino alcun valore, in modo da poter essere chiamate come subroutines. Le funzioni richeste sono:
Queste funzioni chiamano a loro volta le funzioni di libreria per ottenere l'identificativo Toolxdir. Ricordiamo che ad ogni variabile di tipo CHARACTER in Fortran corrispondono in C due argomenti, e cioè un puntatore ad una stringa, e la sua lunghezza. Inoltre, una variabile CHARACTER deve comunque essere completata con spazi bianchi, e non terminata con uno zero, come in C.
Di seguito si riportano come esempio la funzione C GetToolxdirId() e
il segmento di codice FORTRAN che fa riferimento ad essa.
Il costrutto !$pragma C()
assicura la corrispondenza fra il nome della
funzione generato dal compilatore C e quello generato dal compilatore FORTRAN.
Funzione C:
#include "archivio.h" void getxdirid(long telesid, char *toolid, len) { const indexrec *idx = GetIndexByTool(telesid); const char * id = IndexXdir(idx), *err="ERR"; int i; if(idx == NULL) id = err; strncpy(toolid, id, len ); for (i=strlen(id); i<len; ++i) xdir_id[i]=' '; }
FORTRAN call:
external getxdirid !$pragma C(gettoolxdir) ........ call getxdirid(itelesc,ctelesc) ........