Question

Je suis un mannequin dans FORTRAN 77 et j'ai toujours été un codeur C ++, mais je dois modifier un code d'il y a des années ... Je veux créer un tableau de chaînes de taille variable et je ne trouve pas en ligne comment le faire dans Fortran 77. Idéalement, il doit être un tableau avec les deux variables de dimensions, mais si elle n'est pas possible, la longueur de la chaîne que je peux corriger, mais je dois avoir un nombre variable de chaînes.

J'ai essayé ceci:

CHARACTER*32 STR1*(VAR1)
...
WRITE(6,*) STR1(10)

Mais cela ne fonctionne pas ...

Était-ce utile?

La solution

Apparemment, Fortran 77 ne prend pas en charge l'allocation de mémoire dynamique. Vous pouvez essayer d'allocation de la mémoire dans le programme AC et de remettre le résultat à la routine FORTRAN.

Comme fait icihttp://owen.sj.ca.us/~rk/howto/fandc/fandc.mem.html

Ou plus clairement - en utilisant une sorte d'interopt pour appeler la méthode AC

de Fortran.

Le compilateur UNIX Portable FORTRAN-77 ('F77') est écrit presque entièrement dans C. La deuxième passe du compilateur est la même utilisée par le compilateur C, et la plupart des routines de bibliothèque 'F77' sont simplement des interfaces avec les routines de bibliothèque C correspondantes correspondantes . Cependant, comme Fortran ne prend pas en charge les structures de données comme celles utilisées en C, vous ne pourrez peut-être pas profiter de toutes les fonctionnalités que la bibliothèque «maudire» offre. La manipulation des fenêtres avec des «malédictions» est particulièrement difficile. Si vous souhaitez utiliser des routines impliquant des structures de données, vous devriez probablement utiliser C au lieu de FORTRAN.

Pour appeler les routines C à partir d'un programme FORTRAN, vous devrez écrire du code C. FORTRAN transmet les arguments par référence ou adresse, de sorte que la fonction C doit être prête à accepter la variable comme adresse. Cela signifie que vous devrez écrire des fonctions en C qui sont appelées à partir de FORTRAN qui configurent correctement les arguments avant d'appeler la fonction de la bibliothèque. Schématiquement, cela pourrait être quelque chose comme:

Remarque souligner (_) au nom de la routine.

Dans le fichier source C:

foo_ (bar) / * note souligne * / int bar; / / Remarque Les variables sont passées par l'adresse * /

{ : }

Dans le fichier source Fortran:

Appelez foo (baz) / * en supposant que "baz" est un entier. * / {:}

Le soulignement est important car Fortran utilise le caractère pour garder ses symboles droits. Si vous compilez sur un RS6000, ce n'est pas un comportement par défaut, mais la compilation avec l'option -qExtName sur le RS6000 entraînera une performance identique aux autres plates-formes.

Appeler C de Fortran

Notez l'exemple FORTRAN ci-dessous et comment il appelle les routines C:

appel initscr () appel clear (). . . Appelez le mouvement (x, y). . . Appeler Refresh () Appeler Endwin () fin

... où X et Y sont des entiers spécifiant les nouvelles coordonnées.

Appeler des malédictions de Fortran

Si vous appeliez la «routine de malédictions» Move () », vous pourriez faire quelque chose comme ceci:

Le fichier source C contient la routine d'interface à la fonction de bibliothèque 'malédises' Move () ', ainsi que les autres fonctions C qui fournissent une interface aux autres fonctions' malédises::

#comprendre

initscr_ () {initscr (); }

clear_ () {clear (); }

move_ (x, y) int * x, y; / / Ce sont des pointeurs * / {move (* x, * y); }

Refresh_ () {Refresh (); }

endwin_ () {endwin (); }

Les routines sont compilées en utilisant ces commandes:

cc -c maudire.c f77 test.f maudire.o -lcurses -ltermcap

Si vous utilisez des macros définies dans /usr/include/curses.h dans votre fichier FORTRAN, soyez averti qu'ils assument les conventions de la langue C. Sachez que cela peut affecter les résultats que vous obtenez lorsque vous les utilisez dans Fortran.

dehttps://engineering.purdue.edu/ecn/support/kb/docs/CallingcfromForTran

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top