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 :

[Fortran 77] Problème de Compilation (Common et Data)


Sujet :

Fortran

  1. #1
    Membre habitué Avatar de Kenji
    Inscrit en
    Janvier 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Janvier 2005
    Messages : 129
    Points : 143
    Points
    143
    Par défaut [Fortran 77] Problème de Compilation (Common et Data)
    Bonjour à tous.
    Je suis actuellement en stage et je dois compiler un code Fortran mais j'ai quelques soucis.
    En effet quand je compile le code Fortrant j'obtiens des erreurs au niveau du COMMON.
    J'ai l'impression qu'il l i'interprete comme une redondance des variables

    Compilateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    DSCALC_SI.FOR: In program `MAIN__':
    DSCALC_SI.FOR:17:
             DATA NESPEC/0/,NPSPEC/0/,NSTEP/2/,IDIAG/0/
                  1
    DSCALC_SI.FOR:21: (continued):
              COMMON /MIKE/NESPEC,ESPEC,NPSPEC,PSPEC,NSTEP,
                           2
    Invalid declaration of or reference to symbol `nespec' at (2) [initially seen at
     (1)]
    DSCALC_SI.FOR:17:
             DATA NESPEC/0/,NPSPEC/0/,NSTEP/2/,IDIAG/0/
                            1
    DSCALC_SI.FOR:21: (continued):
              COMMON /MIKE/NESPEC,ESPEC,NPSPEC,PSPEC,NSTEP,
                                        2
    Invalid declaration of or reference to symbol `npspec' at (2) [initially seen at
     (1)]
    Et j'ai aussi cette petite erreur la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    DSCALC_SI.FOR:238:
            *'CM2  '/,2(4X4(1PE10.3)/))
                          ^
    Invalid X specifier in FORMAT statement at (^) -- correct form: nX
    Voila si quelqu'un sait comment résoudre ces erreurs je le remercie par avance

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Le DATA doit se faire apres la specification de type, cette derniere incluant le COMMON (COMMON definit en fait une nouvelle variable (MIKE, ici))
    Donc en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          INTEGER NESPEC, NPSPEC, NSTEP, IDIAG
          COMMON /MIKE/ NESPEC, NPSPEC, NSTEP, IDIAG
          DATA NESPEC/0/, NPSPEC/0/, NSTEP/2/, IDIAG/0/
    Cela va marcher.

    Pour ton probleme de format, il est en effet invalide. Difficile de repondre sans connaitre le format que tu souhaites obtenir. Il manque peut etre une virgule (4 caracteres, 4 blocs) ?

  3. #3
    Membre habitué Avatar de Kenji
    Inscrit en
    Janvier 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Janvier 2005
    Messages : 129
    Points : 143
    Points
    143
    Par défaut
    Alors effectivement il fallait mettre dans cet ordre:
    VARIABLES
    COMMON
    DATA
    pour ceux a qui ca peut poser problème.

    Alors en recompilant et en corrigeant les erreurs et warnings a ma portée,j'ai isolé 3 types d'erreurs récurrentes.

    1)Le problème de FORMAT qui est la pour écrire sur le terminal du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WRITE(6,2) (THICK(J),J=1,8)
    avec pour FORMAT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     2 FORMAT(1H0,'SHIELD THICKNESS (GM/CM2)'/,2(4X4(1PE10.3)/))
    Apres recherche sur le terminal,ce Format est la pour écrire des matrices de 2 lignes X 4 colonnes.

    2)Un problème de Common Block
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DSCALC_AS.FOR: In subroutine `prdata':
    DSCALC_AS.FOR:512:
            */1.500E-1,1.600E-1,1.700E-1,1.800E-1,1.900E-1,2.000E-1,
              1
    DSCALC_AS.FOR:630: (continued):
            */1.0E-1,2.0E-1,3.0E-1,4.0E-1,6.0E-1,8.0E-1,
              2
    Common block `damage' initialized at (2) already initialized at (1) -- only one
    program unit may specify initial values for a particular common block
    3)Et enfin deux erreurs un peu obscure pour moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DSCALC_AS.FOR: In subroutine `eqdose':
    DSCALC_AS.FOR:478:
         120 FORMAT (1H ,'SHIELDING g/cm2   ',<nbprot>F12.4/)
                                                     ^
    Variable-expression FORMAT specifier at (^) -- unsupported
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DSCALC_AS.FOR:259: warning:
            *  ,3HDC1,9X,7HEINTERP,5X,7HDFX1*DCI,5X,6HEQFLUX  /  )
                                              ^
    Missing comma in FORMAT statement at (^)
    DSCALC_AS.FOR:259:
            *  ,3HDC1,9X,7HEINTERP,5X,7HDFX1*DCI,5X,6HEQFLUX  /  )
                                                                       ^
    Invalid I specifier in FORMAT statement at (^) -- correct form: [r]Iw.[m]
    Je sais que ça fait pas mal d'erreurs mais si quelqu'un sait comment en résoudre certaines je le remercie par avance.
    Ps:Merci Da Zumba.

  4. #4
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     2 FORMAT(1H0,'SHIELD THICKNESS (GM/CM2)'/,2(4X4(1PE10.3)/))
    Pour ecrire deux lignes de 4 colonnes, il faut 2(4(1PE10.3)) normalement.

    2)Un problème de Common Block
    Un bloc COMMON, par definition, est commun a toutes les routines qui l'incluent. Or ici, tu initialises deux fois "damage". Une initialisation ne doit se faire qu'une fois. Verifie que les deux routines necessitent le meme bloc commun, et si l'une doit modifier les valeurs du bloc, fait le en affectation normale, pas en DATA.

    3)Et enfin deux erreurs un peu obscure pour moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DSCALC_AS.FOR: In subroutine `eqdose':
    DSCALC_AS.FOR:478:
         120 FORMAT (1H ,'SHIELDING g/cm2   ',<nbprot>F12.4/)
                                                     ^
    Variable-expression FORMAT specifier at (^) -- unsupported
    Oui, c'est quoi ce <nbprot> ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DSCALC_AS.FOR:259: warning:
            *  ,3HDC1,9X,7HEINTERP,5X,7HDFX1*DCI,5X,6HEQFLUX  /  )
                                              ^
    Missing comma in FORMAT statement at (^)
    DSCALC_AS.FOR:259:
            *  ,3HDC1,9X,7HEINTERP,5X,7HDFX1*DCI,5X,6HEQFLUX  /  )
                                                                       ^
    Invalid I specifier in FORMAT statement at (^) -- correct form: [r]Iw.[m]
    Il sont horriblement compliques, ces formats.
    Un format doit suivre les regles suivantes:
    - formats repetables : [r]lw.[d ou m][Ee]. l ne peut qu'etre I, F, E, D, G, L, A.
    - formats non repetables: apostrophe, H, T, TL, TR, X, slash, deux points, S, SP, SS, P, BN, et BZ.
    Dans ton cas, 7HEINTERP ne respecte pas ces conditions (j'imagine que INTERP doit etre un mot, donc il ne doit pas etre mele au format: 7E,'INTERP'), et 7HDFX1 non plus (H et X ne sont pas repetables, D et F ne peuvent pas etre mis ensemble). D'ailleurs, DCI et 6HEQFLUX ne doivent pas marcher non plus (j'imagine que le compilateur abandonne).

  5. #5
    Membre habitué Avatar de Kenji
    Inscrit en
    Janvier 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Janvier 2005
    Messages : 129
    Points : 143
    Points
    143
    Par défaut
    J'ai corrigé la 1ere partie,le compilateur crie beaucoup moins,je le mets ici car il devient un peu imposant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    DSCALC_AS.FOR: In program `MAIN__':
    DSCALC_AS.FOR:259: warning:
            *  ,3HDC1,9X,7HEINTERP,5X,7HDFX1*DCI,5X,6HEQFLUX  /  )
                                               ^
    Missing comma in FORMAT statement at (^)
    DSCALC_AS.FOR:259:
            *  ,3HDC1,9X,7HEINTERP,5X,7HDFX1*DCI,5X,6HEQFLUX  /  )
                                               ^
    Invalid I specifier in FORMAT statement at (^) -- correct form: [r]Iw.[m]
    DSCALC_AS.FOR: In subroutine `eqdose':
    DSCALC_AS.FOR:478:
         120 FORMAT (1H ,'SHIELDING g/cm2   ',<nbprot>F12.4/)
                                                      ^
    Variable-expression FORMAT specifier at (^) -- unsupported
    DSCALC_AS.FOR:494:
         100 FORMAT (1H ,'ELECTRON  1MeV/cm2',<nbprot>(1PE12.3)/)
                                                      ^
    Variable-expression FORMAT specifier at (^) -- unsupported
    DSCALC_AS.FOR:500:
         110 FORMAT (1H ,'PROT ISC  1MeV/cm2',<nbprot>(1PE12.3),/,
                                                      ^
    Variable-expression FORMAT specifier at (^) -- unsupported
    DSCALC_AS.FOR:501:
            *        1H ,'PROT VOC          ',<nbprot>(1PE12.3))
                                                      ^
    Variable-expression FORMAT specifier at (^) -- unsupported
    DSCALC_AS.FOR: In subroutine `prdata':
    DSCALC_AS.FOR:512:
            */1.500E-1,1.600E-1,1.700E-1,1.800E-1,1.900E-1,2.000E-1,
              1
    DSCALC_AS.FOR:630: (continued):
            */1.0E-1,2.0E-1,3.0E-1,4.0E-1,6.0E-1,8.0E-1,
              2
    Common block `damage' initialized at (2) already initialized at (1) -- only one
    program unit may specify initial values for a particular common block
    Alors pour répondre a tes questions:
    1)Le compilateur n'a pas l'air d'apprécier DCI,les autres Formats ont l'air de lui convenir.
    2)<nbprot>'après mes tests nbprot est un paramètre qu'on rentre dans le terminal qui consistue le nombre de protections.
    Si x nombre de protections je dirais que c'est equivalent à x(F12.4) par exemple.
    Il est défini comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    99    print  *,' Nb de protections a entrer (max 5)  = '
          read *,nbprot                              
          if(nbprot.le.0.or.nbprot.gt.5) goto 99
    3)Le block Common:Effectivement après lecture du code j'ai deux subroutines qui initialisent le Common DAMAGE qui est constitué de plusieurs tableaux.
    Tu me conseilles de laisser une subroutine initialisée avec les DATA du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       DATA (PMEV(I),I=1,65)
         */1.0E-1,2.0E-1,3.0E-1,4.0E-1,6.0E-1,8.0E-1,
         *.......
         *..../
    Et l'autre en initialisant les tableaux avec des boucles DO?
    Merci pour ton aide.

  6. #6
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Kenji
    Alors pour répondre a tes questions:
    1)Le compilateur n'a pas l'air d'apprécier DCI,les autres Formats ont l'air de lui convenir.
    Tu fais des formats compliques (je n'ai jamais ose atteindre un tel niveau de sophistication). Bon courage !
    Citation Envoyé par Kenji
    2)<nbprot>'après mes tests nbprot est un paramètre qu'on rentre dans le terminal qui consistue le nombre de protections.
    Si x nombre de protections je dirais que c'est equivalent à x(F12.4) par exemple.
    Oui, mais le fait de le mettre entre < > ne va pas le transformer magiquement en entier.
    Il faut que tu fasses un write(c2, '(i2)') nbprot, et ensuite tu completes la chaine de caractere qui donne le format (genre format_string = "(1H, 'SHIELDING g/cm2 '" // c2 // "F12.4)"
    Citation Envoyé par Kenji
    3)Le block Common:Effectivement après lecture du code j'ai deux subroutines qui initialisent le Common DAMAGE qui est constitué de plusieurs tableaux.
    Par definition du mot "initialiser", on ne doit le faire qu'un fois... Donc s'il y a deux initialisations, c'est qu'il y a un probleme de conception quelque part.
    Donc une routine (la premiere rencontree) initialise le common block, puis une autre eventuellement, *modifie* ce bloc (avec des = dans une boucle DO, par exemple). Mais attention, le bloc a alors les nouvelles valeurs partout dans le programme, valeurs qui seront differentes de l'initialisation...

  7. #7
    Membre habitué Avatar de Kenji
    Inscrit en
    Janvier 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Janvier 2005
    Messages : 129
    Points : 143
    Points
    143
    Par défaut
    Et bien en fait ce n'est pas moi qui l'ai écrit ce programme donc je ne suis pas responsable des Formats
    Pour résoudre le DCI je l'ai mis en commentaire vu que le Format ne sert qu'une fois pour l'affichage sur le terminal.

    Par contre je n'arrive pas à corriger les deux autres problèmes:
    1)Les subroutines qui initialisent le COMMON DAMAGE sont appelées au début du Main l'une après l'autre alors je ne sais quoi en penser.
    2)C'est bizzare que nbprot ne soit pas un entier vu qu'il est passé en paramètre à la fonction où on définit les FORMATS où il y a le problème.

    Edit:Après déchiffrage du code je me suis aperçu de quelque chose.
    Dans le COMMON DAMAGE il a plusieurs tableaux.
    Exemple:COMMON /DAMAGE/tab1,tab2,..,tab5.
    En fait la 1ere routine initialise les 2ers tableaux et la 2eme les 3 autres tableaux.
    Suivant tes conseils je devrais mieux utiliser des boucles dans la 2eme subroutine pour corriger cette erreur?

    Pour ce qui est de nbprot:Si ce n'est pas un entier comment peut il faire des tests dessus pour savoir si nbprot ne depasse pas 5?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    99    print  *,' Nb de protections a entrer (max 5)  = '
          read *,nbprot                              
          if(nbprot.le.0.or.nbprot.gt.5) goto 99

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Kenji
    Dans le COMMON DAMAGE il a plusieurs tableaux.
    Exemple:COMMON /DAMAGE/tab1,tab2,..,tab5.
    En fait la 1ere routine initialise les 2ers tableaux et la 2eme les 3 autres tableaux.
    Suivant tes conseils je devrais mieux utiliser des boucles dans la 2eme subroutine pour corriger cette erreur?
    Non, dans ce cas, vu que chaque tableau n'est initialise qu'une seule fois, cela devrait passer. Je ne comprend pas l'erreur du compilateur dans ce cas. Pour simplifier, tu peux initialiser l'ensemble du COMMON dans la premiere routine. Ce sera plus simple a lire, et il est fort possible que le compilateur ne se plaigne plus.

    Citation Envoyé par Kenji
    Pour ce qui est de nbprot:Si ce n'est pas un entier comment peut il faire des tests dessus pour savoir si nbprot ne depasse pas 5?
    Je n'ai pas dit que nbprot n'est pas un entier. C'est justement le probleme : comme nbprot est un entier, il ne peut pas figurer dans une chaine de caractere donnant un format. Et la construction <nbprot> qui semble vouloir transformer nbprot en chaine de caractere n'est pas valide en Fortran standard (c'est peut-etre une extension d'un Fortran special, je ne sais pas).

    Comme tu as recupere le code d'un autre, j'imagine qu'il compilait avant. Tu as change de machine et/ou de compilateur ?

  9. #9
    Membre habitué Avatar de Kenji
    Inscrit en
    Janvier 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Janvier 2005
    Messages : 129
    Points : 143
    Points
    143
    Par défaut
    Ca m'embete un peu de toucher au code et de fondre les 2 routines en une car je souhaiterais au maximum éviter de toucher au code.
    Mais si cela reste la seule solution je le ferais.
    Pour ce qui est de nbprot je comprends mieux ce que tu veux dire,j'avais compris l'inverse hier en fait.
    Pour ce qui estdu programme il compile et marche vu que de nombreuses personnes l'utilisent tous les jours.
    Je crois qu'il tourne sous VMS car j'ai du enlever les extensions du genre
    .FOR;3.
    Merci en tout cas pour ton aide.
    Edit:J'ai mis les deux routines en une et j'ai rentré des nombres à la place des nbprot pour tester.
    Le programme compile mais quand je le lance j'obtiens le message d'erreur suivant qui me parait un peu étrange.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    startio: illegal unit number
    apparent state: unit 6 (unnamed)
    last format: list io
    lately writing sequential formatted external IO
     
    abnormal program termination

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/05/2009, 15h43
  2. [Fortran 77] Problème de compilation avec G77
    Par billybob2 dans le forum Fortran
    Réponses: 1
    Dernier message: 15/06/2007, 08h18
  3. Réponses: 2
    Dernier message: 25/04/2007, 17h44
  4. [Fortran 77] Problème de compilation
    Par Kenji dans le forum Fortran
    Réponses: 26
    Dernier message: 23/05/2005, 16h07
  5. Réponses: 1
    Dernier message: 27/05/2002, 01h44

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