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 :

Rappel multiple de sous-programme


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Par défaut Rappel multiple de sous-programme
    Bonjour!
    J'ai besoin de rappeler plusieurs fois le même subroutine au cours de mon programme. la première fois ça marche très bien! Il prend bien en compte les paramètres que je lui demande et le résultat est juste.
    Ensuite j'entame une boucle durant la quelle les valeurs de certain des paramétrés sont modifiés, le les affiches elles sont justes. Mais lorsque je rappelle les sous-programme qui a comme paramètres ces variables, ça ne marche pas!
    Si j'affiche les paramètres avant le call ceux ci ont les bonnes valeurs et une fois que je les écrit dans le subroutine, il me les change!

    Comment puis je faire?
    En vous remerciant!
    Marielle

  2. #2
    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 : 84
    Localisation : Suisse

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    Salut!
    Je suppose que tu as affiché les valeurs de tes paramètres juste avant l'appel de ton sous-programme, donc à l'extérieur de ton sous-programme. Essaie de les appeler juste après être entré dans ton sous-programme, donc à l'intérieur de celui-ci, tout au début, et compare les deux affichage, pour voir si tes paramètres sont transmis correctement.
    Jean-Marc Blanc

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Par défaut
    Bonjour,

    Cela arrive si ta routine utilise des variables globales, modifiées dans la boucle appelante ou si tu as des dépassements de tableaux (des variables peuvent alors changer mystérieusement)

    Je te propose :
    - de bien identifier tes variables locales/globales
    - de préciser le comportement des arguments de ta routine avec "intent in, out, inout"
    - d'activer les options de compilation de dépassement de tableau

    bonne chasse

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Par défaut
    Merci à vous deux!
    Je vais essayer avec vos précieux conseils!
    Il y a des chance que vous me voyiez revenir dans une heure ou plus!

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Par défaut
    Alors, dans mon sous programme je n'affiche toujours pas les mêmes valeurs de mes paramètres que à l'extérieur, ces paramètres sont en fait des tableaux.
    J'ai déclaré mes variables avec intent in pour les variable utilisé mais non modifié, et intent inout pour celle utilisé et modifié, je ne comprend pas trop à quoi sert le intent out...
    Sinon mon sous programme est externe, je n'ai pas de contains. Est ce que je peux quand même avoir un problème de variable global ou local?

    Merci encore!

  6. #6
    Membre émérite Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Par défaut
    en gros le intent(in) sert à dire que c'est un paramètre, et le intent(out) que c'est un résultat...

    ensuite, ta procédure doit être du genre:

    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
     
    module toto
     
    interface
      subroutine titi(P1,P2,R1)
        implicit none
        real(kind=8),dimension(:,:),intent(in)::P1,P2
        real(kind=8),dimension(:,:),intent(out)::R1
      end subroutine titi
    end interface
     
    end module toto
     
    subroutine titi(P1,P2,R1)
      implicit none
      real(kind=8),dimension(:,:),intent(in)::P1,P2
      real(kind=8),dimension(:,:),intent(out)::R1
    !
      <ce que fait ta routine>
    return !à ne pas oubliéc'est mieux....
    end subroutine titi
    plus ton code principal:

    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
     
     
    program main
    use toto,only : titi
    implicit none
    integer,parameter :: N=50,M=50 !par exemple
    real(kind=8),dimension(N,M)::Pp1,Pp2,Rp1
    integer k
    !
    do k=1,100
    Pp1=.............
    Pp2=.............
    call titi(Pp1,Pp2,Rp1)
    <traitement>
    end do
     
    end program main
    et là, normalement tes tableaux Pp1 et Pp2 ne sont pas modifié au cours du call

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Par défaut
    ok, alors je viens de mettre la structure que tu me conseille, mais il m'affiche des erreur , apparemment il ne reconnait mes équivalent de titi et toto quand je met la ligne "use toto,only : titi"...
    J'ai lu sur un cour de fortran trouvé sur internet que les interfaces pouvait se mettre dans le programme main mais ca ne marche pas non plus...

Discussions similaires

  1. sous programme et parametre
    Par Krispy dans le forum Langage
    Réponses: 2
    Dernier message: 10/04/2006, 17h55
  2. Envoi d'informations dans un sous programme
    Par Tanguy Sarela dans le forum Linux
    Réponses: 3
    Dernier message: 22/12/2005, 16h57
  3. Réponses: 31
    Dernier message: 30/08/2005, 13h10
  4. Réponses: 2
    Dernier message: 04/06/2004, 10h36
  5. [langage] les sous programmes
    Par giverny dans le forum Langage
    Réponses: 6
    Dernier message: 21/07/2003, 19h24

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