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 :

Types dérivés à composantes allouables dynamiquement


Sujet :

Fortran

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut Types dérivés à composantes allouables dynamiquement
    Bonjour à tous,

    J'aurais une petite question s'il vous plaît :
    Est ce que le compilateur GFORTRAN prends en charge les types dérivés à composantes allouables dynamiquement ?
    Sur le manuel j'ai trouvé :
    "TR 15581 : ALLOCATABLE components of derived types"

    http://gcc.gnu.org/onlinedocs/gfortr...an-2003-status

    Je suppose donc que ça devrait marcher, mais faut-il une option de compilation particulière ?

    Merci d'avance,

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut,
    Est ce que le compilateur GFORTRAN prends en charge les types dérivés à composantes allouables dynamiquement ?
    Oui, mais il faut avoir une version récente. Je crois bien que la norme 2003 est aujourd'hui entièrement intégrée.

    ...faut-il une option de compilation particulière ?
    Non.

    J'ai un exemple testé avec gfortran 4.7.3 :
    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
    program main
        implicit none
        type record
            character(len=32) :: name
            real*8, allocatable :: data(:)
        end type record
        type(record) :: x, y
        integer :: i
     
        x%name = "potatoes"
        x%data = (/ (10. / i, i = 1 ,5) /)
     
        y = record("bananas", (/ (10. * i, i = 1 ,10) /) )
     
        call pprint(x)
        call pprint(y)
     
    contains
        subroutine pprint(v)
            type(record) :: v
            print '(a)',     v%name
            print '(e12.4)', v%data
        end subroutine pprint
    end program main
    qui donne :
    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
    potatoes
      0.1000E+02
      0.5000E+01
      0.3333E+01
      0.2500E+01
      0.2000E+01
    bananas
      0.1000E+02
      0.2000E+02
      0.3000E+02
      0.4000E+02
      0.5000E+02
      0.6000E+02
      0.7000E+02
      0.8000E+02
      0.9000E+02
      0.1000E+03

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Ok cela marche effectivement avec ma version pour ton programme test.
    Je reposterai sur ce topic si j'ai un souci avec ces allocations dans mon programme .
    Merci encore.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Bon alors j'ai une petite incompréhension là ...
    J'ai un programme testallocation.f90 qui est le 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
     
    PROGRAM TESTALLOCATION
     
    USE BLABLA
    USE CHAUD
    USE TOTO
    integer :: nl
     
    nl = 5
     
    allocate(enfant%peluche(nl))
     
    CALL OUF(enfant)
     
     
    END PROGRAM TESTALLOCATION
    Dans blabla.f90 je défini le type dérivé doudou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MODULE BLABLA
     
    TYPE doudou
    double precision, dimension(:), allocatable :: peluche
    double precision :: chiffon 
    END TYPE doudou
     
    END MODULE BLABLA
    Dans toto.f90 je définie une variable enfant de type doudou AUQUEL JE DONNE UNE VALEUR POUR L'UN DES CHAMPS DU TYPE (et je sens quelle est là l'erreur ...). A noter que toto est un module ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MODULE TOTO
     
    USE BLABLA
     
    TYPE (doudou) :: enfant
    enfant%chiffon = 0.0
     
    END MODULE TOTO
    Enfin dans le module chaud.f90 je remplie mon tableau peluche et j'affiche les champs de enfant :

    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
     
    MODULE CHAUD
    USE BLABLA
    USE TOTO
    CONTAINS
    	SUBROUTINE OUF(child)
    	INTEGER :: i
    	TYPE(doudou) :: child
    		do i = 1,5
    			child%peluche(i) = i
    			write(*,*) child%peluche(i)
    		enddo
    		write(*,*) child%chiffon
    	RETURN
    	END SUBROUTINE OUF
    END MODULE CHAUD
    Je compile comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    gfortran -c blabla.f90
    gfortran -c toto.f90
    gfortran -c chaud.f90
    gfortran blabla.o toto.o chaud.o -o testallocation testallocation.f90
    et là la console m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      toto.f90:6.21:
     
    edouard%chiffon = 0.0
                         1
    Error: Unexpected affectation statement in MODULE at (1)
    ... Je pense que je ne devrais pas dans un module donner une valeur à un champs de ma variable doudou, mais quelle est la solution alors svp ?

    Merci !

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Bon j'ai trouvé une solution en faisant une subroutine ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    MODULE TOTO
     
    USE BLABLA
     
    TYPE (doudou) :: enfant
     
    	CONTAINS 
    	SUBROUTINE INIT
    		enfant%chiffon = 0.0
    	END SUBROUTINE INIT
    END MODULE TOTO
    là ça marche mais j'ai un nouveau pb que j'exposerai demain sur le même sujet

  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
    Points : 1 346
    Points
    1 346
    Par défaut
    La technique normale pour faire des initialisations de base est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MODULE BLABLA
     
    TYPE doudou
       double precision, dimension(:), allocatable :: peluche
       double precision :: chiffon = 0.0
    END TYPE doudou
     
    END MODULE BLABLA

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Pas dans mon cas, car cela voudrait dire que toute les variables de types doudou aurait leur champs chiffon = 0 ... ce qui peut ne pas être vrai.
    Ici je voulais juste que l'une des variables doudou que j’appelle "enfant", est son champs chiffon =0.
    Bon en tout cas cela semble marcher, je clorai le sujet si c'est le cas.

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/04/2008, 17h16
  2. type statique ou typage dynamique
    Par flotteman dans le forum Langages de programmation
    Réponses: 18
    Dernier message: 15/03/2008, 16h08
  3. Réponses: 2
    Dernier message: 01/02/2008, 16h55
  4. Réponses: 3
    Dernier message: 09/01/2007, 15h27
  5. Réponses: 6
    Dernier message: 27/06/2006, 16h09

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