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)
........