next up previous contents
Next: Manuale d'uso Up: Realizzazione Previous: Routines di gestione dei

Interfaccia con programmi FORTRAN

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:

1.
getxdirid(long *telesc_id, char *xdir_id, int len)    Ritorna in una stringa (di lunghezza massima len) l'identificativo per il programma toolxdir corrispondente al codice numerico telesc_id.
2.
getclassid(int *telesc_id, char *class_id, int len)    Ritorna in una stringa (di lunghezza massima len) l'identificativo CLASS corrispondente al codice numerico telesc_id.
3.
getdoublekeyword(int *telesc_id, char *key, double *value, int len)     Ritorna il valore (double) corrispondente alle keyword key per il telescopio identificato dal codice numerico Toolbox telesc_id.

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

next up previous contents
Next: Manuale d'uso Up: Realizzazione Previous: Routines di gestione dei
Gianni Comoretto
2003-10-31