C équivalent à la liste de noms Fortran

Je suis habitué à Fortran dans lequel j’ai utilisé la lecture séquentielle de la liste de noms pour extraire des variables d’un fichier. Cela me permet d’avoir un fichier qui ressemble à ceci

&inputDataList n = 1000.0 ! This is the first variable m = 1e3 ! Second l = -2 ! Last variable / 

où je peux nommer la variable par son nom et lui atsortingbuer une valeur et un commentaire pour indiquer sa nature réelle. Le chargement se fait extrêmement facilement par

 namelist /inputDataList/ n, m, l open( 100, file = 'input.txt' ) read( unit = 100, nml = inputDataList ) close( 100 ) 

Ma question est la suivante: y a-t-il une chose semblable dans C? Ou devrais-je le faire manuellement en coupant la chaîne entre ‘=’ et ainsi de suite?

Voici un exemple simple qui vous permettra de lire les listes de noms Fortran de C. J’ai utilisé le fichier de liste de noms que vous avez fourni dans la question, input.txt .

nmlread_f.f90 routine Fortran nmlread_f.f90 (remarquez l’utilisation de ISO_C_BINDING ):

 subroutine namelistRead(n,m,l) bind(c,name='namelistRead') use,insortingnsic :: iso_c_binding,only:c_float,c_int implicit none real(kind=c_float), intent(inout) :: n real(kind=c_float), intent(inout) :: m integer(kind=c_int),intent(inout) :: l namelist /inputDataList/ n,m,l open(unit=100,file='input.txt',status='old') read(unit=100,nml=inputDataList) close(unit=100) write(*,*)'Fortran procedure has n,m,l:',n,m,l endsubroutine namelistRead 

Programme C, nmlread_c.c :

 #include  void namelistRead(float *n, float *m, int *l); int main() { float n; float m; int l; n = 0; m = 0; l = 0; printf("%5.1f %5.1f %3d\n",n,m,l); namelistRead(&n,&m,&l); printf("%5.1f %5.1f %3d\n",n,m,l); } 

Notez également que n , m et l doivent être déclarés comme indicateurs pour pouvoir les transmettre par référence à la routine Fortran.

Sur mon système, je le comstack avec la suite de compilateurs Intel (mon gcc et mon gfortran ont plusieurs années, ne demandez pas):

 ifort -c nmlread_f.f90 icc -c nmlread_c.c icc nmlread_c.o nmlread_f.o /usr/local/intel/composerxe-2011.2.137/comstackr/lib/intel64/libifcore.a 

L’exécution de a.out produit le résultat attendu:

  0.0 0.0 0 Fortran procedure has n,m,l: 1000.000 1000.000 -2 1000.0 1000.0 -2 

Vous pouvez éditer la procédure Fortran ci-dessus pour la rendre plus générale, par exemple pour spécifier un nom de fichier avec la liste de noms et un nom de liste à partir du programme C.

J’ai fait un test de réponse ci-dessus sous GNU Comstackrs v 4.6.3 et a parfaitement fonctionné pour moi. Voici ce que j’ai fait pour la compilation correspondante:

 gfortran -c nmlread_f.f90 gcc -c nmlread_c.c gcc nmlread_c.o nmlread_f.o -lgfortran