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

Vue hybride

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    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.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 123
    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 ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Expert confirmé

    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 : 35
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    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é
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    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 émérite
    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
    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
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    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 !
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre éprouvé
    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
    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...

  9. #9
    Membre émérite
    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
    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

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 574
    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

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

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

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

  12. #12
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 123
    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 ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Membre émérite
    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
    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

  14. #14
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 123
    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 ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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, 12h17
  2. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 11h51
  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, 19h38
  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, 14h57
  5. Transtyper element d'1 variable pointant sur TList?
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2003, 23h53

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