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 :

[Débutant] Problème dans ma subroutine


Sujet :

Fortran

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut [Débutant] Problème dans ma subroutine
    Bonjour, je suis en train de débuter avec Fortran et j'apprends donc les procédures et les fonctions. J'ai un bug dans ma subroutine permut_chaine (je veux apprendre à passer une chaine en argument).

    Voici l'erreur (gfortran monprgm.f95 -o out; ./out)

    temp(i)=s(len(s)-i+1)
    1
    Error: Unexpected STATEMENT FUNCTION statement at (1)
    et voici mon programme

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    PROGRAM subroutine
     
    real, dimension(100) :: tab
    real                 :: moyenne, maximum, maxi
    integer              :: i
    character(len=10)    :: chaine
     
    do i=1,100
      tab(i)=rand()
    end do
     
    ! print *,"tab = ",tab
     
    CALL sp(tab,moyenne,maximum)
     
    print*
    print *,"appel de la procedure"
    print *
    print*,moyenne,maximum
     
    maximum=maxi(tab,moyenne)
     
    print*
    print *,"appel de la fonction"
    print *
    print*,moyenne,maximum
     
    chaine="bonjour"
     
    print *
    print *,"avant la procedure permut_chaine : chaine = ",chaine
     
    call permut_chaine(chaine)
     
    print *
    print *,"apres la procedure permut_chaine : chaine = ",chaine
     
    END PROGRAM subroutine
     
    !-------------------------------
    subroutine SP(t,moy,max)
     
    implicit none
     
    real, dimension(100) :: t
    real                 :: moy, max
    integer              :: i
     
    max=t(1); moy=t(1)
    do i=2,100
      if(t(i)>max) max=t(i)
      moy=moy+t(i)
    end do
    moy=moy/100
     
    end subroutine SP
    !-------------------------------
     
    !-------------------------------
    function maxi(t,moy) ! la fonction s'appelle maxi donc ce sera la variable maxi qui sera
    					 ! renvoyee par la fonction
     
    implicit none
     
    real, dimension(100) :: t
    real                 :: moy, maxi
    integer              :: i
     
    maxi=t(1); moy=t(1)
    do i=2,100
      if(t(i)>maxi) maxi=t(i)
      moy=moy+t(i)
    end do
    moy=moy/100
     
    end function maxi
    !-------------------------------
     
    !-------------------------------
    subroutine permut_chaine(s)
    ! cette procedure permutte tous les caracteres de la chaine s : le 1e devient le dernier, le
    ! 2e devient l'avant-dernier etc...
     
    implicit none
     
    character(len=*)      :: s
    character(len=len(s)) :: temp
    integer               :: i
     
    do i=1,len(s)
      temp(i)=s(len(s)-i+1)
    end do
    s=temp
     
    end subroutine permut_chaine
    !-------------------------------
    Merci d'avance

  2. #2
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par salseropom Voir le message
    Bonjour, je suis en train de débuter avec Fortran et j'apprends donc les procédures et les fonctions. J'ai un bug dans ma subroutine permut_chaine (je veux apprendre à passer une chaine en argument).

    Voici l'erreur (gfortran monprgm.f95 -o out; ./out)



    et voici mon programme

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    PROGRAM subroutine
     
    real, dimension(100) :: tab
    real                 :: moyenne, maximum, maxi
    integer              :: i
    character(len=10)    :: chaine
     
    do i=1,100
      tab(i)=rand()
    end do
     
    ! print *,"tab = ",tab
     
    CALL sp(tab,moyenne,maximum)
     
    print*
    print *,"appel de la procedure"
    print *
    print*,moyenne,maximum
     
    maximum=maxi(tab,moyenne)
     
    print*
    print *,"appel de la fonction"
    print *
    print*,moyenne,maximum
     
    chaine="bonjour"
     
    print *
    print *,"avant la procedure permut_chaine : chaine = ",chaine
     
    call permut_chaine(chaine)
     
    print *
    print *,"apres la procedure permut_chaine : chaine = ",chaine
     
    END PROGRAM subroutine
     
    !-------------------------------
    subroutine SP(t,moy,max)
     
    implicit none
     
    real, dimension(100) :: t
    real                 :: moy, max
    integer              :: i
     
    max=t(1); moy=t(1)
    do i=2,100
      if(t(i)>max) max=t(i)
      moy=moy+t(i)
    end do
    moy=moy/100
     
    end subroutine SP
    !-------------------------------
     
    !-------------------------------
    function maxi(t,moy) ! la fonction s'appelle maxi donc ce sera la variable maxi qui sera
    					 ! renvoyee par la fonction
     
    implicit none
     
    real, dimension(100) :: t
    real                 :: moy, maxi
    integer              :: i
     
    maxi=t(1); moy=t(1)
    do i=2,100
      if(t(i)>maxi) maxi=t(i)
      moy=moy+t(i)
    end do
    moy=moy/100
     
    end function maxi
    !-------------------------------
     
    !-------------------------------
    subroutine permut_chaine(s)
    ! cette procedure permutte tous les caracteres de la chaine s : le 1e devient le dernier, le
    ! 2e devient l'avant-dernier etc...
     
    implicit none
     
    character(len=*)      :: s
    character(len=len(s)) :: temp
    integer               :: i
     
    do i=1,len(s)
      temp(i)=s(len(s)-i+1)
    end do
    s=temp
     
    end subroutine permut_chaine
    !-------------------------------
    Merci d'avance
    L erreur est claire, tu a fait une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     do i=1,len(s)
      temp(i)=s(len(s)-i+1)
    end do
    avec lens(s) un caractere!, tandisque len(s) est un integer
    D autre part tu doit utiliser implicit none dans TOUT ton program et non pas seulement dans les fonctions et les subroutines!

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par feynman Voir le message
    L erreur est claire, tu a fait une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     do i=1,len(s)
      temp(i)=s(len(s)-i+1)
    end do
    avec lens(s) un caractere!, tandisque len(s) est un integer
    D autre part tu doit utiliser implicit none dans TOUT ton program et non pas seulement dans les fonctions et les subroutines!
    Salut,
    j'ai rajouté un implict none à mon programme. Merci de ta remarque.
    Concernant ma subroutine qui plante, je ne vois vraiment pas où est l'erreur... si len(s) est un integer alors len(s)-i+1 est aussi un integer et s(len(s)-i+1) doit me renvoyer le (len(s)-i+1)e caractère de ma chaine s.
    Je ne vois pas où est mon erreur (bien que visiblement il y en a une ici)

  4. #4
    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
    L'erreur est que pour manipuler une sous-chaine de caractère, tu dois tioujours utiliser Chaîne(Début:Fin) et non Chaîne(Position). La ligne en erreur dois donc se lire temp(i:i)=s(len(s)-i+1:len(s)-i+1). Compte tenu de l'expression utilisée, tu aurais alors avantage à créer une variable temporaire contenant len(s)-i+1.

Discussions similaires

  1. [Débutante] Problème dans la traduction de données
    Par charpy dans le forum Interfaces Graphiques
    Réponses: 13
    Dernier message: 27/03/2008, 15h52
  2. [ débutant ] problème dans boucle
    Par waved dans le forum Langage
    Réponses: 4
    Dernier message: 16/01/2008, 09h49
  3. [Débutant] Problème dans une boucle Matlab
    Par RaphTIM dans le forum MATLAB
    Réponses: 3
    Dernier message: 05/06/2007, 18h51
  4. [débutant] problème dans le cours de S.Tahe
    Par olivier57b dans le forum Servlets/JSP
    Réponses: 17
    Dernier message: 19/02/2007, 13h56
  5. [Débutant] Probléme dans applet
    Par brionne dans le forum Applets
    Réponses: 1
    Dernier message: 29/08/2005, 11h53

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