Probleme passage de parametres FORTRAN / C

Fermé
Utilisateur anonyme - 27 avril 2004 à 11:46
 Utilisateur anonyme - 28 avril 2004 à 15:03
Bonjour,

je vous expose mon probleme, sur lequel je trime depuis quelques jours maintenant : je dois developper un programme principal en fortran, qui fait appel a un sous programme en C. Jusque la tout va bien, un appel avec CALL et une bonne edition de lien et ça tourne...
Le probleme c'est dans le passage des parametres qu'il se trouve : Le prog principal doit récupérer deux chaines de caracteres (respectivement de 4 et de 20 de longueur) et 3 rééls double précision (real*8 en fortran, et double en C). Ces 5 parametres sont donc en sortie du sous-programme en C, mais je n'arrive pas a obtenir que les valeurs soient renseignées dans le prog fortran; En gros il n'y pas de bug de compilation, ni d'execution, mais les chaines et les réels que je retrouve en fortran sont vide, donc c'est comme si le sous-prog ne faisait rien. Et pour corser le tout, juste avant le 'return' dans le ss-prog en C je teste les valeurs des parametres et ces derniers sont tout a fait bien renseignés, alors a mon avis le probleme réside dans la compatibilité entre C et FORTRAN, alors je vous pose la question : comment je fais pour recupérer mes valeurs du ss-porg en C vers le prog principal en fortran ???

Merci d'avance, pasque j'ai essayé tout ce que je connaissait pour le moment...
A voir également:

3 réponses

blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 160
27 avril 2004 à 12:03
bonjour
une question :
dans la fonction C les paramètres sont passés par adresse ou par valeur ?
a+
0
Utilisateur anonyme
27 avril 2004 à 14:27
salut, actuellement les parametres sont passés par référence, mais en gros je peux décider de les passer comme je le veux... du moment qu'au final ça fonctionne...
a+
0
Marden Messages postés 1072 Date d'inscription dimanche 11 février 2001 Statut Membre Dernière intervention 29 janvier 2006 210
27 avril 2004 à 12:12
Bonjour,

En Fortran, les arguments d'une fonction sont à la fois arguments d'entrée et de sortie, ce qui signifie qu'ils sont passés par adresses.
C'est donc dans l'écriture de la fonction C qu'il faut respecter cette convention, en utilisant des pointeurs.
Parmi les autres "pièges", et selon la machine, il peut être nécessaire d'ajouter un "_" devant le nom de la fonction, et sous VMS (Digital Equipment), se méfier du pasage de chaînes par "descripteur".
0
Utilisateur anonyme
27 avril 2004 à 14:26
bé justement je suis sous VMS, et j'ai lu des histoires bizarres a propos d'une taille de chaines de caracteres cachée (lié au descripteur???) quand on passe une chaine en parametres.
Si je pouvais avoir des précisions sur 'comment on fait pour faire que ça marche' ça s'rait sympa.
Sinon des précisions sur l'ecriture de la fonction en C : j'ai deux chaines de caracteres a passer, la premiere de 4 caracteres (toujours) et la seconde de 20 caracteres (au max). Il y a aussi deux réels double précisions apres les chaines. Je les ai tous déclarés en pointeurs, de sorte que mon ss-prog se présente ainsi :
void ZBSTATI_SPA(char *str1, char *str2, double *d1, double *d2, double *d3)
J'aurais donc deux questions svp : le _ au milieu du nom du ss-prog peut-il poser un pb??
est-ce que je dois utiliser des descripteurs pour passer mes chaines depuis le fortran, et si oui comment je m'y prend? et si non qu'est-ce qui peut me rester d'autre comme solutions??
merci a+
0
Marden Messages postés 1072 Date d'inscription dimanche 11 février 2001 Statut Membre Dernière intervention 29 janvier 2006 210
27 avril 2004 à 17:10
A défaut d'écrire un nouveau compilateur, le choix se limite ... au respect des conventions de passage des arguments.
Pour voir quelle tête a un "descripteur", tu peux passer par une fonction d'impression en hexa, en considérant que ce descripteur est vu, côté fonction, comme un tableau de 3 entiers longs. Si mes souvenirs - lointains - sont bons, le descripteur comprend un code sur 2 octets, la longueur (statique) sur 2 octets, et l'adresse de la chaîne elle-même sur 4 octets.
La solution la plus simple est sans doute la conversion de chaîne en tableau d'entiers et inversement (comme avant le Fortran 77) avec des read/write internes.
Pour l'emploi du "_" dans le nom de la routine, il doit faire partie de l'alphabet étendu chez DEC, vérifiable facilement (erreur à la compilation). L'ajout par le compilateur en début du nom à l'appel ne se rencontre apparemment que pour les compilateurs de machine Unix (Sun, HP, Aix). Si le même source est destiné à être employé sur différents types de machine, on règle le problème du nom avec une directive du préprocesseur du genre (et l'option de compilation qui va avec) :
#if appel_depuis_fortran
{nom_fonction} => _{nom_fonction}
#endif
0
Utilisateur anonyme
28 avril 2004 à 15:03
J'ai trouvé une solution plus simple, ou plutot moins contraignante que la conversion en entiers : j'ai tout simplement inclus mes variables dans une structure, eet tout est passé nickel. ça doit juste etre une histoire d'adresse, mais ça regle le probleme.
La prochaine fois j'encapsulerait tout avant de commencer a me prendre la tete....

Merci bien pour votre aide, bonne continuation
0