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 :

Deallocation en cascade


Sujet :

Fortran

  1. #1
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut Deallocation en cascade
    Bonjour à tous,

    Voici mon problème, j'ai repris un ancien programme que je suis censé débogger et à l'intérieur se trouvent un tas de structures du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TYPE PARALLELE
        integer::indiceParallele
        complex(8)::Zparallele
        complex(8),dimension(:,:),allocatable::YP
    END TYPE PARALLELE
     
    TYPE PARALLELE_LIST
        integer::nbParallele
        type(PARALLELE),dimension(:),allocatable::TParallele
    END TYPE PARALLELE_LIST
    que j'alloue dans mon programme initiale en fonction de paramètres issus d'un base de donnée.

    Et j'aimerais simplement savoir si un deallocate(TParallele) suffit à tous supprimer ou si je suis obligé de désallouer d'abord tous les YP puis les TParallele.

    A noter que dans le programme c'est la première solution qui est utilisée, alors que j'opterais pour la seconde (mais avant de modifier un grand nombre de lignes de codes, je préfère demander l'avis d'experts)

    Merci beaucoup pour votre aide,

    @+.
    For crying out loud !

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par PadawanDuDelphi
    Et j'aimerais simplement savoir si un deallocate(TParallele) suffit à tous supprimer ou si je suis obligé de désallouer d'abord tous les YP puis les TParallele.
    C'est la seconde solution. Typiquement, on désalloue dans l'ordre inverse des allocations.

    EDIT: Il semble en fait que j'ai tort. Voir la suite du fil.

  3. #3
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Ok,

    merci beaucoup pour ton aide, il me semblait aussi qu'on avait vu ça en cours en C. Mais je voulais être sûr avant de me lancer dans la modification des 4000 lignes de codes...

    Encore merci,

    @+.
    For crying out loud !

  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
    Tu n'as pas à désallouer les membres allocatables. C'est une différence importante et un grand avantage des membres allocatables sur les membres pointers. Ta première solution est donc suffisante.

  5. #5
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Sylvain Bergeron
    Tu n'as pas à désallouer les membres allocatables. C'est une différence importante et un grand avantage des membres allocatables sur les membres pointers. Ta première solution est donc suffisante.
    Interessant. Tu as une source pour cela ?

  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
    J'ai malheureusement une journée de fou. J'ai cherché très rapidement sous google group comp.lang.fortran. Je n'ai pas trouvé explicitement ce que tu demande, mais une phrase qui reflète l'étendu de la cascade...

    It's also worth mentioning that the TR support in the particular case of the Lahey compiler is an "unsupported" feature. While most of it works very well, there is one particular area which is broken: the automatic deallocation, on subroutine entry, of an INTENT(out) allocatable dummy argument. I submitted this bug to Lahey, but since the TR capabilities are unsupported, they filed my bug report as a product suggestion (d'oh!).
    La discussion complète : http://groups.google.com/group/comp....7fbd71d24113f4

    (Si l'anglais cause problème) Ça dit que si tu passe une variable (type) contenant un membre allocatable à une fonction dont l'argument est intent out, le membre sera désalloué automatiquement à l'entrée.

    Si tu veux chercher, la piste est probablement Fortran 2003 ou TR 15581 (extension standard ISO à F95 intégré dans F2003)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Je ne sais pas si ça peut faire avancer les choses mais je travaille en ce moment avec des tableaux (allocatables) de structures contenant des variables "allocatable" et je suis plutôt de l'avis de Sylvain Bergeron. Je viens même de rencontrer un cas où la désallocation d'un tableau contenu dans un structure (type) qui est elle-même l'élèment d'un tableau "allocatable" causait des erreurs à l'execution. Alors qu'en désallouant uniquement le tableau de structures contenant tout le reste, aucun problème ! Toutes les variables se réinitialisent comme il faut à la réallocation. (Mon programme tourne en boucle sur plusieurs fichiers et je réalloue plusieurs fois d'affilée les tableaux de structures).

    Voilou pour mon expérience perso... ça vaut ce que ça vaut.

    @ +,

    Mathlus.

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Mathlus
    Je ne sais pas si ça peut faire avancer les choses mais je travaille en ce moment avec des tableaux (allocatables) de structures contenant des variables "allocatable" et je suis plutôt de l'avis de Sylvain Bergeron.
    Ok, j'ai regarde les quelques rares informations disponibles la-dessus sur l'Internet, et il semble que Sylvain ait raison, en effet. My mistake! J'edite mon premier post. Par contre, je suis surpris que desallouer les allocatable a la main induise un comportement different, comme tu l'ecris, Mathlus. La gestion de la memoire en Fortran90 me semble assez etrange, tout d'un coup...

  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
    Points : 1 346
    Points
    1 346
    Par défaut
    Ça s'est un peu calmé, alors j'ai repris ma recherche.

    Voici le document TR 15581 : ftp://ftp.nag.co.uk/sc22wg5/N1351-N1400/N1379.pdf

    Première phrase en haut de la page 5 :
    Deallocation of a variable containing an ultimate allocatable array component automatically deallocates all such components of the variable that are currently allocated.

  10. #10
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    OK,

    Merci beaucoup pour votre aide (surtout que ca va m'eviter de modifier ce long code)...

    Dernière petite question: Si on effectue une desallocation des elements internes avant de supprimer l'element principal (solution 1), il y a aucune raison pour que ça plante, non?

    @+.
    For crying out loud !

  11. #11
    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
    Je ne vois pas pourquoi ça ne marcherait pas, mais Mathlus semble avoir une expérience contraire. Faudrait voir son code pour juger...

  12. #12
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    De toute façon ça parait plus logique et plus facile d'opter pour la désallocation d'un élément plutôt que de désallouer l'intérieur des stucture auparavant...

    J'avais juste continuer le programme avec la methode numérp 2 et je voulais savoir si je devais le modifier ou pas, mais je pense que je vais le faire pour uniformiser.

    Merci pour tout,

    @+.
    For crying out loud !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    En fait, la déallocation qui m'a posé problème est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Deallocate(MyMesureAcous(i)%Response%LocalColumnX%Values)
    où MyMesureAcous est un tableau allocatable et Values aussi.
    Pas d'erreur à la compilation mais un "access violation" à l'execution. J'ai donc opté pour la solution "je déalloue juste MyMesureAcous" et là pas de problème...

    J'ai aussi eu une erreur (à la compilation cette fois, du style "vous ne pouvez pas déallouer un tableau qui n'est pas allocatable") avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Deallocate(MyChampAcous%Response%LocalColumnX%Values)
    où comme dans l'exemple précédent, Values est un tableau allocatable (alloué et utilisé pour des calculs pour tôt dans le code) et MyChampAcous un type simple (pas de tableau).
    Du coup, j'ai laissé tomber le deallocate et j'ai réussi à réallouer le tableau (Allocate(MyChampAcous%...%Values)) sans problème à l'itération suivante, avec des valeurs tout à fait cohérentes et un tableau de taille diffénrete à l'itération précédente.

    Si vous pouvez m'expliquer tout ça, c'est pas de refus !!

    @ +,

    Mathlus.

  14. #14
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Salut,

    J'ai déjà un message de ce genre, mais c'était parcque mon tableau n'était pas alloué précédemment...
    Sinon je vois pas...

    @+.
    For crying out loud !

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Je te confirme que mon tableau était bel et bien alloué au moment où j'essayais de le désallouer. Je ne comprends pas non plus...

  16. #16
    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
    Mathlus :

    Il est difficile de comprendre ce qui ne va pas avec aussi peu d'information. Si tu as besoin de la réponse au problème, tu devras nous fournir soit le code source complet, soit une version simplifiée qui reproduit le problème.

    As-tu compilé en mode « debug » ?

    Il y a aussi une autre possibilité pour que tu trouve par toi même : essaie avec un autre compilateur. Il est assez facile d'en avoir un gratuit pour une période d'essai, ce qui est suffisant pour un tel besoin. Un compilateur différent produit souvent un diagnostic différent, ce qui permet d'isoler le problème.

Discussions similaires

  1. Suppression de tables en cascade
    Par Moah dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/07/2004, 15h36
  2. Delete en cascade
    Par defrgly57 dans le forum ASP
    Réponses: 3
    Dernier message: 12/04/2004, 12h13
  3. Delete on cascade avec SQL server
    Par fadoua dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/01/2004, 11h02
  4. delete en cascade
    Par bruno270579 dans le forum Requêtes
    Réponses: 8
    Dernier message: 16/12/2003, 17h17
  5. suppresion en cascade + postgres
    Par bruno270579 dans le forum Requêtes
    Réponses: 3
    Dernier message: 16/12/2003, 16h27

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