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 :

Structure dynamique modifiée dans subroutine = "Data transfer element at (1) cannot have POINTER components"


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Homme Profil pro
    Elève ingénieur ENSG
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Elève ingénieur ENSG
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 20
    Points
    20
    Par défaut Structure dynamique modifiée dans subroutine = "Data transfer element at (1) cannot have POINTER components"
    Bonjour,

    J'utilise une structure contenant, pour chaque année, une liste de mois (qui est elle-même une structure contenant une liste de noms de fichiers), comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TYPE MOIS
    	CHARACTER (len=2)				:: Numero_Mois
    	CHARACTER (len=19), DIMENSION(:), POINTER	:: Noms_Fichiers ! Liste des fichiers (sessions) du mois
    END TYPE
     
    TYPE ANNEE
    	CHARACTER (len=4)			:: Numero_Annee
    	TYPE(MOIS), DIMENSION(:), POINTER	:: Mois ! Liste des mois avec des mesures
    END TYPE
    Je ne connais pas à l'avance le nombre de mois qui vont être enregistrés pour une année, tout comme je ne sais pas combien de fichiers peuvent appartenir à un mois (cela varie fortement en fonction des années et des mois). D'où la nécessité de l'allocation dynamique donc...


    Dans mon module, j'utilise une première fonction allouant la place nécessaire à l'enregistrement de données dans une variable de type ANNEE. J'aimerais que cette fonction renvoie donc cette variable, afin de l'utiliser en entrée d'une autre fonction, qui va effectuer des calculs dessus.

    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
     
    MODULE Mon_module
    IMPLICIT NONE
     
    TYPE MOIS
    	CHARACTER (len=2)				:: Numero_Mois
    	CHARACTER (len=19), DIMENSION(:), POINTER	:: Noms_Fichiers ! Liste des fichiers (sessions) du mois
    END TYPE
     
    TYPE ANNEE
    	CHARACTER (len=4)			:: Numero_Annee
    	TYPE(MOIS), DIMENSION(:), POINTER	:: Mois ! Liste des mois avec des mesures
    END TYPE
     
    CONTAINS
     
     
    SUBROUTINE Main
    	IMPLICIT NONE
    	TYPE(ANNEE), DIMENSION(:), ALLOCATABLE	:: Data
     
    	CALL Enregistrement_donnees(Data)
     
            PRINT *,Data
     
    	CALL Traitement_donnees(Data)
     
    END SUBROUTINE Main
     
     
    END MODULE


    Problème : impossible de récupérer ce que contient la variable de type ANNEE, avec ce message d'erreur :

    PRINT *,Data
    1
    Error: Data transfer element at (1) cannot have POINTER components

    Je ne comprends pas vraiment ce que cela signifie. J'ai eu beau chercher sur internet, les structures dynamiques existent bien et fonctionnent parfaitement, que ce soit avec une subroutine ou une fonction. Est-ce que quelqu'un verrait ce qui cloche ici svp ?


    Merci d'avance pour votre aide.

  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
    Je pense qu'il faut préciser les objets pointés. Je montre un exemple didactique avec 1 seule année, 2 mois (2 fichiers pour le premier et 1 seul pour le second) :
    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
     
    MODULE Mon_module
    IMPLICIT NONE
     
    TYPE MOIS
        CHARACTER (len=2) :: Numero_Mois
        ! Liste des fichiers (sessions) du mois
        CHARACTER (len=19), DIMENSION(:), POINTER :: Noms_Fichiers => null()
    END TYPE
     
    TYPE ANNEE
        CHARACTER (len=4) :: Numero_Annee
        ! Liste des mois avec des mesures
        TYPE(MOIS), DIMENSION(:), POINTER :: Mois => null()
    END TYPE
     
    END MODULE Mon_module
     
     
    program main
        use Mon_module
        IMPLICIT NONE
        TYPE(ANNEE), DIMENSION(:), ALLOCATABLE :: Data
     
        ! 1 seule année avec 2 mois
        allocate(Data(1))
     
        Data(1)%Numero_Annee = "2013"
        allocate(Data(1)%Mois(2))
     
        Data(1)%Mois(1)%Numero_Mois = "02"
        allocate(Data(1)%Mois(1)%Noms_Fichiers(2))
        Data(1)%Mois(1)%Noms_Fichiers(1) = "foo1"
        Data(1)%Mois(1)%Noms_Fichiers(2) = "foo2"
     
        Data(1)%Mois(2)%Numero_Mois = "06"
        allocate(Data(1)%Mois(2)%Noms_Fichiers(1))
        Data(1)%Mois(2)%Noms_Fichiers(1) = "bar"
     
        PRINT *, Data(1)%Mois(1)%Numero_Mois
        PRINT *, Data(1)%Mois(1)%Noms_Fichiers(1)
        PRINT *, Data(1)%Mois(1)%Noms_Fichiers(2)
     
        PRINT *, Data(1)%Mois(2)%Numero_Mois
        PRINT *, Data(1)%Mois(2)%Noms_Fichiers(1)
     
        deallocate(Data(1)%Mois(1)%Noms_Fichiers)
        deallocate(Data(1)%Mois(2)%Noms_Fichiers)
     
        deallocate(Data)
     
    end program main
    J'ai l'impression de tu te compliques la vie en définissant trop de types. Essaie avec un type record ayant les attributs year, month et filename.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Elève ingénieur ENSG
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Elève ingénieur ENSG
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 20
    Points
    20
    Par défaut
    J'ai ajouté les => null()
    mais cela ne change pas le résultat...

    La fonction Enregistrement_donnees que j'évoque dans mon exemple se charge d'allouer la mémoire nécessaire, comme tu le montres dans ton exemple, en récupérant l'arborescence de mes dossiers et fichiers, qui est reproduite dans ma variable de type ANNEE. Le problème c'est qu'à la compilation le programme refuse que ma variable soit utilisée hors de cette fonction... Pourtant j'ai bien besoin de cette structure, car les mois et le nombre de fichiers présents sont 'aléatoires' d'une année sur l'autre.

  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
    Le message « Error: Data transfer element at (1) cannot have POINTER components » apparait à la compilation, n'est-ce-pas ?

    Personnellement, j'en déduis que le problème est que tu ne peux pas imprimer la structure « Data » en espérant que le compilateur déroule ta structure, pointeurs inclus. Et le problème est limité au print. Tu devras écrire une routine Affichage_donnees(Data), dans laquelle tu dérouleras la structure par des boucles pour afficher le contenu élément par élément.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Elève ingénieur ENSG
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Elève ingénieur ENSG
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 20
    Points
    20
    Par défaut
    En effet, c'est tout simplement ça... je vais essayer d'être un peu moins bête la prochaine fois. Encore merci à vous !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/06/2018, 19h33
  2. Réponses: 5
    Dernier message: 15/04/2012, 16h40
  3. Réponses: 4
    Dernier message: 22/12/2011, 16h54
  4. Allocation dynamique dans subroutine d'un argument
    Par kranck dans le forum Fortran
    Réponses: 13
    Dernier message: 22/09/2008, 17h01
  5. Allocation dynamique tableau dans structure
    Par chental dans le forum C
    Réponses: 2
    Dernier message: 03/08/2006, 09h03

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