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 :

[compilation f90] ERROR: Dummy argument is longer than the actual argument


Sujet :

Fortran

  1. #1
    Membre actif
    Profil pro
    ingénieur
    Inscrit en
    Novembre 2011
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Novembre 2011
    Messages : 165
    Points : 259
    Points
    259
    Par défaut [compilation f90] ERROR: Dummy argument is longer than the actual argument
    Bonjour à tous,

    J'essaie de compiler en f90 un programme qui compilait sans problème en gfortran.
    Or ça ne compile pas, j'ai le message d'erreur suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR: Dummy argument "NOM" is longer than the actual argument
    Voici le contenu (épuré au maximum de manière à reproduire l'erreur sans s'embarasser d'instructions inutiles) du programme.

    fichier constantes.f90:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MODULE Constantes
     
      IMPLICIT NONE
     
      INTEGER,PARAMETER :: LENMAXNOM = 10 ! Longueur max des noms de colonnes
    END MODULE Constantes
    fichier module_1.f90:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    MODULE module_1
     
      USE Constantes
     
      IMPLICIT NONE
     
    CONTAINS
       SUBROUTINE routine_1(Nom)
        IMPLICIT NONE
        CHARACTER(LEN=LENMAXNOM) :: Nom
      END SUBROUTINE routine_1
    END MODULE module_1
    fichier module_2.f90:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    MODULE module_2
     
    USE module_1
     
    IMPLICIT NONE
     
    CONTAINS
     
    SUBROUTINE routine_2()
    IMPLICIT NONE
    CALL routine_1('')
    END SUBROUTINE routine_2
     
    END MODULE module_2
    à la compilation, j'ai:
    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
    f90 -M./OBJ -aligncommon=8 -xtypemap=real:64 -c ./SRC/constantes.f90 -o ./OBJ/constantes.o
    f90 -M./OBJ -aligncommon=8 -xtypemap=real:64 -c ./SRC/module_1.f90 -o ./OBJ/module_1.o
    f90 -M./OBJ -aligncommon=8 -xtypemap=real:64 -c ./SRC/module_2.f90 -o ./OBJ/module_2.o
     
    MODULE module_2
           ^
    "./SRC/module_2.f90", Line = 1, Column = 8: ERROR: The compiler has detected errors in module "MODULE_2".  No module information file will be created for this module.
     
    CALL routine_1('')
                   ^
    "./SRC/module_2.f90", Line = 11, Column = 16: ERROR: Dummy argument "NOM" is longer than the actual argument.
     
    f90comp: 14 SOURCE LINES
    f90comp: 2 ERRORS, 0 WARNINGS, 0 OTHER MESSAGES, 0 ANSI
    make: *** [OBJ/module_2.o] Error 1
    Je n'ai pas l'impression d'avoir fait d'erreur de codage.... s'agit-il d'un bug de f90 (sunstudio versioon 12) ?

    merci pour votre aide

    ps: mon makefile

    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
    37
    38
    39
    40
    41
    42
    43
    44
    # Nom(s) des compilateur(s)
    F90C=f90
     
    # Noms des binaires
    BIN=bipbipyaeah
     
    # Noms des directories
    DIRSRC=./SRC
    DIROBJ=./OBJ
     
    F90FLAGS=-M$(DIROBJ) -aligncommon=8 -xtypemap=real:64
     
    # Liste des objet
    OBJ=$(DIROBJ)/constantes.o\
            $(DIROBJ)/module_1.o\
            $(DIROBJ)/module_2.o
     
    # Cible norm
    norm:   init $(BIN)
     
    # Cible all
    all:     norm
     
    # Cible init
    init:
            @if [ ! -d $(DIROBJ) ]; then \mkdir -p $(DIROBJ); fi;
            @if [ ! -d $(DIRDBX) ]; then \mkdir -p $(DIRDBX); fi;
            @if [ ! -d $(DIREXE) ]; then \mkdir -p $(DIREXE); fi;
     
    # Construction du binaire
    $(BIN): $(OBJ) $(LISTOBJ)
            $(F90C) $(F90FLAGS) $(OBJ) $(LISTOBJ) -o $(BIN) $(LDFLAGS) -lc
            @-\mv $(BIN) $(DIREXE)
     
    # Construction des objets
    $(DIROBJ)/constantes.o: $(DIRSRC)/constantes.f90
            $(F90C) $(F90FLAGS) -c $(DIRSRC)/constantes.f90 -o $(DIROBJ)/constantes.o
            -@ mv *.mod $(DIROBJ) 2>/dev/null|:
    $(DIROBJ)/module_1.o:   $(DIRSRC)/module_1.f90
            $(F90C) $(F90FLAGS) -c $(DIRSRC)/module_1.f90 -o $(DIROBJ)/module_1.o
            -@ mv *.mod $(DIROBJ) 2>/dev/null|:
    $(DIROBJ)/module_2.o:   $(DIRSRC)/module_2.f90
            $(F90C) $(F90FLAGS) -c $(DIRSRC)/module_2.f90 -o $(DIROBJ)/module_2.o
            -@ mv *.mod $(DIROBJ) 2>/dev/null|:

  2. #2
    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
    Points : 1 346
    Points
    1 346
    Par défaut
    Une variable caractère Fortran, ce n'est pas un string comme en C dont une section seulement peut-être utilisée; c'est une variable ayant une longueur fixe.

    Dans ton cas, tu dis dans routine_1 que tu t'attends à recevoir une variable caractère de 10 de long alors que tu lui passes une variable de longueur 0.

    En pratique, les dummy arguments caractère devraient toujours être de longueur variable (*). Si le reste du traitement ou la situation requiert une longueur fixe ou une longueur maximale, il suffit de tester la situation. J'aurais donc écrit routine_1 comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       SUBROUTINE routine_1(Nom)
        IMPLICIT NONE
        CHARACTER(LEN=*) :: Nom
     
        if (len(Nom) > LENMAXNOM) then
            write(0,*) 'Erreur: Nom trop long.'
            stop
        endif
     
      END SUBROUTINE routine_1

  3. #3
    Membre actif
    Profil pro
    ingénieur
    Inscrit en
    Novembre 2011
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Novembre 2011
    Messages : 165
    Points : 259
    Points
    259
    Par défaut
    merci pour ta réponse

    Donc si je comprend bien, gfortran est plus permissifs à ce genre d'écart à la norme fortran alors que f90 ne laisse pas passer.

Discussions similaires

  1. probleme de compilation separée : error LNK2005
    Par babar63 dans le forum C++
    Réponses: 0
    Dernier message: 09/11/2007, 04h59
  2. Réponses: 5
    Dernier message: 17/10/2007, 01h10
  3. Réponses: 5
    Dernier message: 04/10/2007, 18h11
  4. Réponses: 1
    Dernier message: 14/03/2007, 07h25
  5. Problème de compilation (parse error before '*' token)
    Par moon93 dans le forum Autres éditeurs
    Réponses: 8
    Dernier message: 11/06/2006, 22h39

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