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

Langage Delphi Discussion :

La question du 12h55 sur TList


Sujet :

Langage Delphi

  1. #1
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut La question du 12h55 sur TList
    Pourquoi TList utilise un PPointerList et non un "array of Pointer" ?

    PS: je n'ai pas la réponse, mais il m'a fallu un bout de temps avant de repérer une fuite de mémoire qui venait d'un dérivé de TList qui surchargeait Clear sans inherited...donc sans SetCapacity(0) et libération du PPointerList.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Ma réponse est qu'il devrait y avoir un sous-forum spécial pour les experts qui aiment se prendre la tête sur des problèmes qui dépassent 98% des autres utilisateurs...

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    un PPointerList c'est un pointeur sur un TPointerList qui est lui même un tableau "array[0..MaxListSize - 1] of Pointer"

    Cela permet de définir un tableau infini (2Go max), il s'utilise comme un tableau (grace au pointeur typé) et s'alloue sauvagement en pointeur via GetMem, en fait c'est la méthode que l'on utilisait en Delphi 3 pour avoir des tableau dynamiques alors qui n'existait pas encore ! !
    Et la TList existait déjà en Delphi 3 !

    Voir le sujet "Taille d' un tableau de tableau"

    Effectivement, oublier le inherited Clear() dans une surchage (surtout que c'est virtual -> override), c'est bête, moi aussi j'ai perdu du temps pour le même genre d'oublie, exemple lorsque j'oubliais un inherited Destroy dans mes surcharges de destructeur, tu as des comportements à la fin du programme assez dingue ...

  4. #4
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Ben oui, m'est avis que c'est simplement un héritage de Delphi 2/3, qui ne permettaient pas les tableaux dynamiques.
    Pour ne pas casser le code existant (descendants de TList), ils n'ont pas pu réimplémenter TList. Ca montre d'ailleurs que c'était mal encapsulé

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Sans rapport, mais absolument aucun: Paul Toth, est-ce que tu aurais étudié/travaillé à l'université de Bologne en Italie ? Je demande parce que je viens de tomber sur un document scientifique (algorithmes) écrit en collaboration avec un certain "Paolo Toth", de l'université de Bologne donc...

  6. #6
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Peut être que vous n’aviez pas lu ça ShaiLeTroll
    MaxListSize = Maxint div 16;
    FList (PPointerList) c'est un pointeur malgré tout ne consomme que quatre octets de mémoire et je ne suis pas d’accord avec toi seulement cet appel peut créer le MaxListSize de pointeurs
    FList^[Index] := ??? ;
    heureusement SetCapacity intervient avant un tel appel c’est la méthode add qui alloue la taille si capacité n’a pas était définie, moi je pense que c’est une question purement de performance PPointerList point sur le premier élément et qui va garantir la contigüité des éléments une simple ligne de code permet de trouver import quelle élément index := PPointerList ;inc(index,sizeof(poiter)) ; et facilite l’opération de suppression, insertion dans la liste tu peut voir cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.Move(FList^[Index + 1], FList^[Index],
          (FCount - Index) * SizeOf(Pointer));
    Un tableau dynamique ne pointe pas sur le premier élément on doit le faire manuellement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     Setlength(Tab,Size) ;
    @ Tab[0] ;
    et je ne sais pas si contigüité est garanti lorsque on augmente la taille du tableaux enfin utiliser un index du tableaux sera un peux encombrant inutile de lire la même information deux fois .

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    ben si, un tableau dynamique est une pointeur sur le premier élément

    et List[i] pointe sur le ième pointeur, du point de vue codage il y a très peu de différence...je pense que c'est en effet lié à l'historique de Delphi...mais bon ça m'a un peu surpris.

    PS pour GoustiFruit : non je suis allé à Rome en début d'année, mais c'était mon premier passage en Italie des Paul TOTH y'en a un peu partout sur la planète !

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Citation Envoyé par Montor Voir le message
    Peut être que vous n’aviez pas lu ça ShaiLeTroll
    MaxListSize = Maxint div 16;
    Si Si, regarde ma réponse de 2007, ICI dans "Fichier CSV, Compteur de lignes"

    Le MaxListSize est aussi associé à la TStringList (et non à la TList ), qui gère des items dont le SizeOf de 16 octets, c'est que vient le "div 16", effectivement, je regrettais déjà le choix d'un MaxListSize commun mais a déjà osé mettre autant d'élément, moi je l'ai fait mais dans un arbre ce qui décuple les possibilités ...
    Citation Envoyé par ShaiLeTroll
    Pour la TList, on devrait avoir plus d'élement possible, mais c'est la même limite qui a été choisi ...
    Citation Envoyé par Montor Voir le message
    FList (PPointerList) c'est un pointeur malgré tout ne consomme que quatre octets de mémoire et je ne suis pas d’accord avec toi seulement cet appel peut créer le MaxListSize de pointeurs
    Euh , tu n'es pas d'accord avec moi, mais sur quoi ?
    Sache que ce soit un pointeur, un tableau, une chaine, tout ça c'est toujours alloué de façon continue , heureusement (je ne parle pas de la tambouille OS qui swappe derrière, c'est pas notre problème), j'avais déjà évoqué dans un sujet que je retrouve pas le fait que la mémoire n'est JAMAIS fragmenté sinon on ne s'en sortirait jamais ...

    Citation Envoyé par Paul TOTH Voir le message
    ben si, un tableau dynamique est une pointeur sur le premier élément ...
    effectivement, Montor, tu n'étais pas loin de le comprendre, ton raisonnement par tatonnement est le même que j'ai suivi, il y a quelques années, dommage que tu ne l'as pas suivi jusqu'au bout ...

  9. #9
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Bonjour
    Peut être que je n’ai pas bien exprimé je voulais dire voici un exemple marche avec un tableaux statique mais pas avec un tableau dynamique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Tab:array of byte;
     
    handle:=fileopen('C:\RD.mdb',fmOpenRead);
    Size:=GetFileSize(handle,nil) ;
    SetLength(Tab,Size);
    l’erreur est ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    fileread(handle,Tab,Size);//Ne marchera pas ici
     
    fileread(handle,Tab[0],Size);//Marche
     
    fileread(handle,Pointer(Tab)^,Size);// Marche

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Merci Montor, de traduire en code, ce que l'on répête depuis le début, un tableau dynamique est en fait un pointeur sur un tableau ... mais tes efforts sont louables ...

    Sinon, je n'ai toujours pas compris, en quoi tu n'étais pas d'accord sur PPointerList




    EDIT : Tient j'avais déjà expliqué cela en 2007 dans "addresse d'un tableau dynamique. ", c'est marrant, non ...

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Montor, GetMem c'est une fonction qu'il faut appeler !
    Le sujet étant assez pointu, j'ai pensé que les interlocuteurs savaient de quoi je parlais et tu l'aurais vu dans "Taille d' un tableau de tableau", alors si c'est vague, pose des questions au lieu de critiquer ce que tu ne comprends pas !

    Pour la mémoire, elle n'est jamais fragmenté d'un point de vue Delphi, tu as un pointeur, tu peux utiliser ton pointeur et toutes les adresses suivantes jusqu'à la taille que tu lui à allouer, c'est pour cela que je dis que c'est un bloc continue ... et j'ai bien précisé que c'est ce que l'on voit en tant qu'utilisateur d'API, celle Windows en particulier (on peut penser que c'est globalement pareil en Linux) ... donc je ne parlais pas de ce que fait Windows avec la mémoire, dans une utilisation basique du pointeur, on s'en fout comme il va le mettre dans la mémoire Vive, mémoire Virtuelle, ... qui là effectivement va être géré comme il le sent, il est évident que si il y a une partie de la mémoire dans les barettes et une autre sur le Disque Dur, c'est évident que c'est fragmenté, mais cela ne nous regarde pas ...

    Ensuite, tu enchaines, sur un MP, c'est sympa, personne dans le sujet sait que quoi tu parle, ... tu flood un sujet interessant, c'est du n'importe quoi !

    EDIT : il y a eu censure du message de Montor, du coup, le mien perd de son sens, je le laisse tel quel quand même ... même si c'est pas facile à suivre ...

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    des Paul TOTH y'en a un peu partout sur la planète !
    mon dieu...

  13. #13
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ensuite, tu enchaines, sur un MP, c'est sympa
    poste trop longue

  14. #14
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 955
    Points
    3 955
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    des Paul TOTH y'en a un peu partout sur la planète !
    Horreur, l'invasion a commencé...

    Cdlt

  15. #15
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 764
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 764
    Points : 13 386
    Points
    13 386
    Par défaut
    Je dirais plutôt qu'un Paul Toth avec le don d'ubiquité,.. Delphi est sauvé .

Discussions similaires

  1. Question d'algorithmique sur HeapSort
    Par didier2604 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 02/09/2004, 11h17
  2. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  3. [Débutant]Quelques questions de principe sur l'API win32
    Par silver_dragoon dans le forum Windows
    Réponses: 4
    Dernier message: 19/03/2004, 18h38
  4. [LG]J'ai honte : question de cours sur les paramètres
    Par letibdesneiges dans le forum Langage
    Réponses: 14
    Dernier message: 17/01/2004, 13h57
  5. Transtyper element d'1 variable pointant sur TList?
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2003, 22h53

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