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 :

Module et tableau dynamique


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 99
    Par défaut Module et tableau dynamique
    Salut à tous,

    Avant de me lancer dans l'écriture d'une longue subroutine, et n'ayant jamais touché aux modules avec fortran95, j'ai fait un petit programme test afin de me familiariser avec ce nouvel outil.
    Mais, au malheur, l'allocation dynamique d'un tableau dans un module, n'aboutit qu'à recevoir les insultes du compilateur...

    Je laisse le module en copie, si quelqu'un a une idée, je le remercie par avance de sauver l'amitié que j'avais lié avec mon 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
     	MODULE conf_ini
    	IMPLICIT NONE
     
    	REAL (KIND=8), DIMENSION(:), ALLOCATABLE :: atom
    	INTEGER (KIND=4) :: ntot
    	INTEGER (KIND=4) :: x,compt
     
    	CONTAINS
    	SUBROUTINE CPA(atom,ntot)
     
    	REAL (KIND=8), DIMENSION(:), ALLOCATABLE :: atom
    	INTEGER (KIND=4) :: ntot
    	INTEGER (KIND=4) :: x,compt
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    	ntot=9
    	allocate(atom(ntot))
    	compt=0
     
    	DO x=1,ntot  
    	compt=compt+1
    	atom(x)=real(compt)
    	ENDDO
     
    	deallocate(atom)	
     
    	END SUBROUTINE CPA
    	END MODULE conf_ini

  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 Module et tableau dynamique
    Salut.

    Parfois, dans la vie, il faut faire des choix: si tu veux "faire moderne", utilise l'allocation dynamique, mais ne t'étonne pas si tes programmes trainent les pieds.

    Tu peux aussi imiter le vieux croulant que je suis et te restreindre à une allocation strictement statique. C'est souvent beaucoup plus efficace. C'est une règle tout à fait générale, comme tu le verras par exemple dans la documentation de MatLab.

    A toi de choisir.
    Jean-Marc Blanc

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 99
    Par défaut
    Salut,

    Merci pour l'info, c'est un problème auquel je dois effectivement me préocuper puisque le code en question est un Monte Carlo et autant le faire converger le plus rapidement possible.

    Cependant mon problème initial demeure, comment remplir un tableau dans un module2, dont la taille est fixé dans un premier (module1) ?

    Est-ce ainsi qu'il faut s'y prendre ?

    MODULE1 : Je détermine la taille de mon tableau (par exemple l'entier ntot)

    MODULE2 : Je déclare mon tableau
    SUBROUTINE(montableau)
    REAL KIND(8), DIMENSION(ntot) :: montableau

    PROGRAM : je déclare un tableau que j'alloue en dynamique ou autre ? j'appel le module1 puis le module2 ?
    Il y a quelque chose à cette étape qui coince et dans lequel je me fourvoie...

    Merci encore ton message.

  4. #4
    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 Module et tableau dynamique
    Re-salut!

    Juste une petite suggestion: va sur le site www.netlib.org et cherche la librairie LinPack. Ensuite, tu ouvres un sous-programme, par exemple DGEFA et tu regardes comment ils font. C'est peut-être vieillot, mais ça marche, et plutôt bien.

    Bon succès
    Jean-Marc Blanc

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Bonjour,

    Pour info, ton module compile très bien chez moi (avec g95) et le code test suivant:
    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
     
     	MODULE conf_ini
    	IMPLICIT NONE
     
    	REAL (KIND=8), DIMENSION(:), ALLOCATABLE :: atom
    	INTEGER (KIND=4) :: ntot
    	INTEGER (KIND=4) :: x,compt
     
    	CONTAINS
    	SUBROUTINE CPA(atom,ntot)
     
    	REAL (KIND=8), DIMENSION(:), ALLOCATABLE :: atom
    	INTEGER (KIND=4) :: ntot
    	INTEGER (KIND=4) :: x,compt
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    	ntot=9
    	allocate(atom(ntot))
    	compt=0
     
    	DO x=1,ntot  
    	compt=compt+1
    	atom(x)=real(compt)
            write(*,*)'x=',x,'atom(x)=',atom(x)
    	ENDDO
     
    	deallocate(atom)	
     
    	END SUBROUTINE CPA
    	END MODULE conf_ini
     
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            program test_module
            use conf_ini
     
            call CPA(atom,ntot)
     
            end program test_module
    affiche bien le contenu du tableau comme on s'y attend.

    Par contre, vu que le tableau est désalloué dans la foulée, s'est assez contre-productif...

    Vu tes messages, le but que tu recherche est de partager l'info entre plusieurs routines et le programme principal; les modules sont effectivement ce qu'il te faut mais il faut bien voir que c'est le fait d'inclure un module ici et là qui mène au partage de l'information.
    Peut-être que l'exemple suivant sera plus parlant qu'un long discours:
    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
     
    module common_stuff
    implicit none
    ! Variables du module:
    integer :: taille
    real(kind=8),dimension(:),allocatable :: tableau
     
    contains
     
    subroutine ini_tableau
    implicit none
     
    ! variable locale
    integer :: i
     
    write(*,*) 'Taille du tableau?'
    read(*,*) taille
     
    ! Allocation du tableau + initialisation des elements
    allocate(tableau(taille))
    do i=1,taille
      tableau(i)=i
    enddo
     
    end subroutine ini_tableau
    end module common_stuff
    !!!!!!!!!!!!!!!!!!!!!!!!
    program share_data
    use common_stuff
    implicit none
     
    ! variables locales
    integer :: i
     
    ! initialisation
    call ini_tableau
     
    do i=1,taille
      write(*,'(a9,i2,a2,g15.5)')'tableau(',i,')=',tableau(i)
    enddo
    ! NB: 'taille' et 'tableau sont connu grace au 'use common_stuff'
     
    end program share_data
    La subroutine 'ini_tableau' connait 'taille' et 'tableau' à cause du contains; de même pour le programme principal grâce au use common_stuff.

    Bonne continuation.

  6. #6
    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
    Par défaut
    Je seconde Ehouarn pour les modifications proposées. La routine ini_tableau pourrait cependant avoir un paramètre de taille en paramètre. La saisie de la taille requise pourrait alors être déplacée ailleurs (dans ton Module1).

    De l'externe, tu dois uniquement fournir la taille du tableau. Il me semble illogique de passer en paramètre le tableau à dimensionner puisqu'il fait partie du module.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  2. récupérer la memoire et tableau dynamique
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 06/01/2003, 08h02
  3. AFFICHER UN TABLEAU DYNAMIQUE
    Par ghassenus dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2002, 14h19
  4. [Kylix] tableau dynamique
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 31/10/2002, 08h57
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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