IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

Directive EQUIVALENCE dans gfortran44


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 4
    Par défaut Directive EQUIVALENCE dans gfortran44
    Bonjour,
    Je porte un code fonctionnant déjà sur platefomes VAX, SUN, AIX et HP sur LINUX (CentOs 5) en utilisant gfortran44.
    le fonctionnement de la directive a changé par rapport aux autres plateformes:
    INTEGER*4 IX3
    INTEGER*2 ITX(2)
    EQUIVALENCE (IX3,ITX(1))

    IX3=10000
    WRITE(6,FMT='(2I10)'),ITX(1),ITX(2)

    Avant le code m'affichait : 0 10000

    Maintenant il m'affiche : 10000 0

    Ce resulat actuel est erronné car ITX(1) est la partie 0 de IX3 et ITX(2) est la partie 10000 de IX3.

    Merc pour votre aide.

  2. #2
    Membre éprouvé Avatar de rogue-spectre
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Par défaut
    Salut,

    Je ne connais pas la syntaxe "equivalence"… mais bon, si j'ai bien compris tu :
    -declares un entier long IX3
    -declares un tableau d'entier courts de deux cases ITX
    -tu dis que parler de IX3 c'est pareil que ITX(1)
    -tu mets IX3 à 10000 donc ITX(1) devrait passer à 10000 aussi (ou pas puisque ils ne sont pas du même types )
    -tu affiches ITX ce qui devrait te renvoyer (ou pas) : 10000 pour ITX(1) et une valeur arbitraire pour ITX(2) (enfin ça dépend des options de compilation)

    D'après ce que j'ai pu lire, "equivalence" n'est pas forcement à conseiller puisque une même variable peut avoir plusieurs noms, ce qui amène des erreurs difficiles à trouver. Ce que tu pourrais essayer c'est de travailler avec un même type pour tes deux variables déjà… et même te débarrasser de "equivalence".

    Dis moi si je me trompes sur l'interprétation du problème… en passant j'ai pas trop capté la dernière phrase…
    Est-ce qu'en fait tu veux "couper" ton long en deux courts ? J'ai l'impression que tu veux qu'en mettant un long dans la première case du tableau de courts celui ci se repartisse sur les deux cases. Si c'est ça… j'espère que non… c'est assez tordu comme méthode.

    Bonne journée

    PS : Ça ne serait pas un peu mieux de passer à un fortran un brin plus moderne, 2008 ou mieux non ? Enfin je dis ça…
    PS2 : le titre de la page sur laquelle j'ai trouvé l'info sur "equivalence" est "1-5 FORBIDDEN / ESOTERIC / OBSOLETE STATEMENTS ", c'est assez parlant

  3. #3
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 4
    Par défaut
    L’instruction EQUIVALENCE permet à des variables de partager la même zone
    mémoire au sein d’une unité de programme.
    Donc :
    INTEGER*4 IX3
    INTEGER*2 ITX(2)
    EQUIVALENCE (IX3,ITX(1))
    IX3=10000

    est equivalent a:
    |-----ITX(1)-----|-----ITX(2)-----|
    |---------------IX3----------------|
    =
    | 0 | 10000 |

    ==> ITX(1) = 0
    ITX(2), = 10000

    ITX(1) : bits de poids faibles de IX3
    ITX(2) : bits de poids forts de IX3

    Merci

  4. #4
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 85
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    Salut!
    Le problème n'est pas dans l'instruction Equivalence mais dans le fait que les ordinateurs ne stockent pas tous de la même manière les nombres occupant plus d'un octet. Pour plus de détails, cherche big endian dans Wikipedia (même en français).
    Jean-Marc Blanc

  5. #5
    Membre éprouvé Avatar de rogue-spectre
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Par défaut
    On comprend donc mieux pourquoi cette instruction est à déconseiller… mon diagnostic était bon je serais moins bête ce soir sur ce problème d'équivalence… Merci à JM Blanc.

    Bonne soirée à tous.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    Le problème découle effectivement de l'endianness et de la non portabilité qui en découle.

    La solution « Fortran 90+ » consiste à utiliser la fonction transfer().

Discussions similaires

  1. Réponses: 14
    Dernier message: 21/01/2011, 14h04
  2. Réponses: 3
    Dernier message: 03/07/2009, 10h58
  3. [C#]Equivalences dans les destructeurs
    Par ClaudeBg dans le forum Windows Forms
    Réponses: 0
    Dernier message: 01/04/2009, 14h44
  4. Réponses: 7
    Dernier message: 09/03/2009, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo