A voir également:
- Probleme passage de parametres FORTRAN / C
- Ouvrir paramètres - Guide
- Passage qwerty azerty - Guide
- Paramètres de confidentialité - Guide
- Paramètres dns - Guide
- Parametres comptes options de connexion - Guide
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
27 avril 2004 à 12:03
bonjour
une question :
dans la fonction C les paramètres sont passés par adresse ou par valeur ?
a+
une question :
dans la fonction C les paramètres sont passés par adresse ou par valeur ?
a+
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
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".
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".
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+
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+
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
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
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
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
La prochaine fois j'encapsulerait tout avant de commencer a me prendre la tete....
Merci bien pour votre aide, bonne continuation
27 avril 2004 à 14:27
a+