Question

J'ai un projet qui est à moitié en C et la moitié en Fortran 77. [Non, pas Fortran 90 ou 03, Fortran 77.] Le code serait beaucoup plus propre si je pouvais passer des pointeurs générés sur le côté C Retour à Fortran , qui les passent ensuite de retour si nécessaire pour le traitement dans d'autres fonctions C. Comme il est, le code C est rempli de variables globales qui ne devrait pas être globale, et est par ailleurs sur le point de devenir un gâchis non structuré. Donc, y at-il des moyens raisonnablement fiables pour passer un pointeur opaque entre C et Fortran?

Était-ce utile?

La solution

Vous pouvez le faire avec le (non standard) extension de pointeur Cray:

http://gcc.gnu.org/onlinedocs/gfortran/Cray -pointers.html

Autres conseils

Si vous êtes sur le code Fortran plate-forme 32 bits, considérez les pointeurs de coulée en nombres entiers et passer les entiers. Lorsque le Fortran les passe en retrait, reconvertir le nombre entier de nouveau dans un pointeur, doigts croisés, et à utiliser.

D'après ce que je me souviens (d'il y a 25 ans), Fortran 77 tend à passer tout à C par pointeur de toute façon -. Et des chaînes de caractères sont transmis avec une longueur, et les tableaux sont transmis avec leurs dimensions

Si vous êtes sur une plate-forme 64 bits, vous aurez à travailler si le compilateur Fortran 77 fournit tout entiers à 8 octets (ENTIER * 8?) - je soupçonne que ce ne sera pas (largement confirmé en regardant le documentation GNU , si vous utilisiez Fortran 2003, vous seriez en meilleure forme, il semble). Si elle le fait, la même astuce fonctionne. Si elle ne le fait pas, vous êtes en territoire beaucoup dodgier.

Vous pouvez essayer - par rapport aux recommandations - à l'aide d'une union d'un double et d'un pointeur. Dans le C, vous devez créer le pointeur dans l'union de votre pointeur de code C, puis copiez la double de l'union en un véritable Fortran * 8, et aussi longtemps que personne ne touche qu'à l'exception de le copier ou de le transmettre retour, peut-être vous serez OK si les dieux sourient favorablement sur vos efforts. Très probablement si, tout cela va exploser - ce genre d'union a une incroyable capacité à détecter le moment où le client sera plus ennuyé si quelque chose ne fonctionne pas et procédera alors à exploser au bon moment, - en partie grâce à la démo ou quinze minutes après le programme passe en direct.

Une alternative à considérer (toujours avec ses dents) est une union d'un pointeur 64 bits et un tableau de deux entiers de 32 bits, et nécessitant le code Fortran pour passer un tableau de deux entiers lorsque vous avez besoin de revenir un pointeur (64 bits). De toute évidence, un tableau d'un nombre entier (s) fonctionnerait au code de 32 bits; peut-être juste besoin le code d'appel pour passer un tableau de deux entiers dans tous les cas, la mise à zéro de la valeur entière non utilisée dans le cas de pointeur 32 bits? Cela vous donne migratability avant.

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