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

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Points : 6
    Points
    6
    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 : 83
    Localisation : Suisse

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    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
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 107
    Points
    107
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Points : 6
    Points
    6
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Points : 6
    Points
    6
    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 éclairé 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
    Points : 825
    Points
    825
    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
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Points : 6
    Points
    6
    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...

  8. #8
    Membre éclairé 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
    Points : 825
    Points
    825
    Par défaut
    il y a un très bon cours de fortran à cette adresse:

    http://www.idris.fr/data/cours/lang/...choix_doc.html

    où il y a du F77,90-95 et même une intro au F2003.

    cependandant, moi la structure que je te propose est celle que j'utilise, pour ça, je mets dans deux fichiers, et, évidement, il faut compiler le module avant le prog principal qui l'utilise.

    il n'est pas nécéssaire de mettre le only, si tu utilise toute les fonctions du modules, et même si tu ne les utilise pas, le compilo te donne un warning comme quoi tu charges des fonctions/variables que tu n'utilise pas...

    peux-tu montrer un bout de ton code, histoire de voir ce qui va pas?
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Merci d'avance.

    Alors en haut de mon programme principal j'ai ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	program projet12
    	use gauss1,only : gauss
    	implicit none
    	! puis mes variables
    A un moment j'appelle ma subroutine GAUSS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	Call GAUSS( matsimpl, Fsimpl,n, reponse)
    et dans le fichier qui contient gauss j'ai ca :
    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
    	module gauss1
    	interface
    	  subroutine gauss(matsimplGAUSS,conditions,n,reponse)
    		implicit none
    		! variables
    		integer  i, j, k
    		integer, intent(in)::n
    		real, intent(in):: matsimplGAUSS,  conditions
    		real, intent(inout):: reponse
    		real mat, mat_prim,D, F,  temp
    		dimension matsimplGAUSS(n,n), mat(n,n+1), mat_prim(n,n), conditions(n), F(n), reponse(n)
    	  end subroutine gauss
    	end interface
    	end module gauss1
    	subroutine GAUSS(matsimplGAUSS,conditions,n,reponse)
    	implicit none
     
            ! variables
    	integer i, j, k
    	integer, intent(in)::n
    	real, intent(in):: matsimplGAUSS,  conditions
    	real, intent(inout):: reponse
    	real mat, mat_prim,D, F,  temp
    	dimension matsimplGAUSS(n,n), mat(n,n+1), mat_prim(n,n), conditions(n), F(n), reponse(n)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Mon problème est que lors du 2eme appel à GAUSS, je ne retrouve pas mes bon paramètres.
    Je write juste avant l'appel mes paramètres que j'envoie, et je les write des la réception dans ma subroutine et ils ne sont pas identiques (pour mon premier paramètre)


    Merci d'avance, je suis totalement perdue

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Je crois que j'avance, je vous tiens au courant.
    Merci encore

    (et a bientôt j'en ai bien peur)

  12. #12
    Membre éclairé 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
    Points : 825
    Points
    825
    Par défaut
    c'est bizarre que dans ta déclaration d'interface tu mette aussi les variables qui ne sont pas des intent...

    tu n'est pas obligé de les mettres... de plus je te conseil de déclarer tes dimension en même temps que la variable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    real(kind=8),dimension(1:,1:),intent(in) ::matsimplGAUSS,  conditions
    pas besoin de donner la taille exacte, en gros tu dis juste que c un tableau à double entrée, le n te servira uniquement dans le code de la routine pour pas aller trop loin. evidement les tableau locaux doivent être déclarer avec la bonne taille...

    verifie aussi: Fortran stocke toout en colonne... ferai-tu une inversion d'indice?
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

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