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 :

Allocation pointeur (pointeur dans un type)


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut Allocation pointeur (pointeur dans un type)
    salut

    J'ai un petit probleme : j'ai declaré tous mes types (structure) dans un module
    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 generique
           blabla....
           type materiel
                      integer ::  nb
                      type(composante),dimension(:),pointer  ::  compo
                      blabla...
           end type materiel
           type composante
                      blabla...
                      real ::  len
           end type composante
    end module generique
     
    module materiel
             use generique
             type(materiel),save  ::  mat
    end module materiel
     
    subroutine lecture
            use materiel
            blabla....
            allocate(mat%compo(mat%nb))   !=> et la c'est le drame !!!!!
            blabla .....
    end subroutine lecture
    A la compil tout est ok et à l'exe il ne veut pas me faire l'allocate !!!!

  2. #2
    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 n'ai pas trouvé l'erreur.

    Le code n'était pas compilable pour les raisons suivantes :

    • Présence de blabla...
    • Nom materiel utilisé à plusieurs fins


    J'ai donc ajouté la lettre T devant les types et M devant les noms de module. J'ai aussi ajouté la ligne mat%nb = 5 avant le allocate, puis quelques lignes pour compléter l'exemple. Tout fonctionne mais ça ne dit pas où se trouve l'erreur de ton programme complet...
    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 Mgenerique
    !blabla....
    type Tmateriel
    integer :: nb
    type(Tcomposante),dimension(:),pointer :: compo
    !blabla...
    end type Tmateriel
    type Tcomposante
    !blabla...
    real :: len
    end type Tcomposante
    end module Mgenerique
     
    module Mmateriel
    use Mgenerique
    type(Tmateriel),save :: mat
    end module Mmateriel
     
    subroutine lecture
    use Mmateriel
    !blabla....
    mat%nb = 5
    allocate(mat%compo(mat%nb)) !=> et la c'est le drame !!!!!
    !blabla .....
    mat%compo%len = 3
    write(*,*) mat%compo%len
    end subroutine lecture
     
    program test
      call lecture
      end

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    le probleme c'est qu'il compile sans souci, sauf qu'a l'execution il s'arrete a l'allocation, je cherche un probleme de lisibilite dans la structure materiel

    je m'explique : au debut j'avais tout mis dans un module :

    module materiel

    constantes....

    types ....

    contains

    et la tous mes subs

    end module materiel

    tout marcher bien nickel !!!
    sauf que j'ai voulu remetttre de l'ordre et j' ai fait 4 modules

    module generique => il contient tous les types
    module constante => il contient toutes les constantes
    module materiel => declaration de la variable mat (que je fais passer de sub en sub pour l'initialiser)
    module initialisation => fait appel aux differentes subs

    et que maintenant la compil est ok mais l'exe s'arrete a l'allocate
    j'ai fais un nullify sur le pointer mat%compo et un associate pour voir sur koi il pointait et tout est ok (il renvoit false)
    (sinon la structure du programme est comme enonce, sauf avec plus de champs a completer)
    perso se qui me gene c'est le pointer dans mon type (on m'impose d'utiliser les "plus de f90" mais j'ai pas trop confiance en eux.....)


  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
    Par défaut
    Le code illustré ne me permet pas de voir le problème. Peut-être que la simplification, en réduisant la complexité, a pour effet de faire disparaitre le problème.

    Je te suggère les pistes suivantes :

    • Imprimer tous les intrants du allocate avant de l'effectuer
    • Vérifier que mat%nb n'est pas trop grand
    • Ajouter une clause STAT= au allocate
    • Ajout d'un test pour le résultat du STAT=
    • Enlever l'optimisation et activer tous les contrôles ("debug" on)


    Dernier point un peu hors contexte :

    Ton découpage en modules ne semble pas orienté vers l'encapsulation et l'abstraction. Généralement (mais pas nécessairement tout le temps), il est préférable d'avoir un module par type dans lequel on place également les constantes et procédures associées à ce type. L'entretien est alors simplifié car la "connaissance" associée à un type est entièrement contenu dans un seul module. Une modification interne du type est alors limitée à un module.

  5. #5
    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
    salut,

    allocate(mat%compo(mat%nb)) !=> et la c'est le drame !!!!!
    à mon avis, il manque un attribut "allocatable" à compo ...

  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
    Citation Envoyé par afrancisco
    à mon avis, il manque un attribut "allocatable" à compo ...
    Non. Compo est un pointeur. Il est possible d'allouer dynamiquement une variable allocatable ou un pointeur. D'ailleurs, un membre allocatable dans un type n'est pas permis en F95. C'est uniquement permis à compter du TR 15581 (extension "standard" à F95 incorporée à F2003).

  7. #7
    Membre confirmé Avatar de Fortran90
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 83
    Par défaut
    non mais compo c'est un "pointer"

    Petites lacunes en Fortran?

    ça compile nickel chez moi avec les modifs de Mister Bergeron...a pas de soucis contrairement au code donné au départ
    (devancé d'un poil !!!)

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    voila qques nouvelles, j'ai bien fait printer tout ce qui etait necessaire pour l'allocate et ca ne marche pas, j'ai donc fais (par desespoir) une interface ds mon programme et il ne connait pas le type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    subroutine initialisation
     
    use materiel
     
    interface 
          subroutine lecture(mat)
                    use generique
                    type(materiel)::mat
          end subroutine
    end interface
     
    call lecture(mat)
     
    end subroutine initialisation

    il veut toujours pas faire l'allocate !!!!
    c'est forcement un probleme de lisibilite, avant me "restructuration" tout marchait .......
    ce programme me maltraite

  9. #9
    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
    Si je me fie sur ton bout de code, tu utilises toujours "materiel" comme nom de module et comme nom de type. C'est illégal. Ton compilateur devrait le détecter. S'il ne le détecte pas, rien ne garantie qu'il a compris. Le problème peut donc être simplement qu'il est confus.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    j'ai changé le nom des module , type etc .... et ca marchait toujours pas alors j'ai declaré mat dans le module materiel en tant que pointeur et je l'ai alloué dans le programme principal et tout fonctionne correctement , merci a tous pour votre soutient et vos conseils forts utiles ......

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

Discussions similaires

  1. Allocation de pointeur dans le constructeur ou pas ?
    Par Beulard dans le forum Langage
    Réponses: 8
    Dernier message: 04/12/2010, 16h00
  2. Réponses: 11
    Dernier message: 20/10/2006, 13h19
  3. passage pointeur NULL dans une fonction
    Par reptils dans le forum C
    Réponses: 4
    Dernier message: 11/05/2006, 23h12
  4. Positionnement pointeur souris dans champ texte
    Par angelevil dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/03/2006, 12h58
  5. [MFC]recup pos pointeur curseur dans CEdit
    Par lucky dans le forum MFC
    Réponses: 3
    Dernier message: 08/09/2005, 10h47

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