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 :

Alternative à un Set Of


Sujet :

Langage Delphi

  1. #21
    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
    @Gilbert :

    Ton alternative est intéressante pour des petits ensembles de grosses valeurs. Autrement dit, pour des ensembles à peu d'éléments mais pour lesquels les éléments peuvent être gros.

    Par contre, stocker une liste d'entiers dans une TStringList, c'est un peu beaucoup du gaspillage de place mémoire et de vitesse d'exécution. Il faut utiliser un tableau dynamique d'entiers/de TColor.

    Et je ne sais pas où tu as appris à utiliser des object. Mais c'est une syntaxe obsolète depuis Turbo Pascal, donc depuis plus de 10 ans.
    On utilise des class.

    Ne prends surtout pas cela comme des reproches ni du dénigrement, mais comme une invitation à t'améliorer. Après tout, c'est ça l'esprit du forum

  2. #22
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Super cela marche nickel à présent. que ce soit Include, Exclude ou Exists qui posaient toujours problème.

    Je viens de tester sur un type de base de 2 et 4 octets, (avec et sans MOVZX) et cela fonctionne parfaitement.

    Merci pour ce code très formateur.


    @Gilbert
    J'ai regardé ton code également, ca peut-être également une alternative plus 'accessible' que le code de sjrd.
    Dis-moi tu utilises des Object et non class ?
    Un vieux réflexe ?

    [edit]
    Ah sjrd a été plus rapide que moi !!
    [/edit]

    @+ Claudius

  3. #23
    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
    Citation Envoyé par Cl@udius Voir le message
    Je viens de tester sur un type de base de 2 et 4 octets, (avec et sans MOVZX) et cela fonctionne parfaitement.
    Avec 4 octets, essaye avec MOVZX et en donnant une valeur qui ne tient pas dans 2 octets -> Ca va poser des problèmes.

    Tu n'auras pas de violation, mais des incohérences. Car $12345678 sera considéré exactement comme $00005678. En fait c'est comme si toutes tes valeurs étaient "masquées" avec un $0000FFFF.

    Edit :
    Citation Envoyé par Cl@udius Voir le message
    [edit]
    Ah sjrd a été plus rapide que moi !!
    [/edit]
    Ce post m'intéresse particulièrement. Je le suis à la trace

  4. #24
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Bon j'ai défini TBigValue ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      TBigValue = $0000..$FFFF;
    J'ai conservé le MOVZX, et je créé mon ensemble ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      BigValues := TBigValueSet.Create([$FFF0]);
    et pourtant le BigValueSetToString me renvoie bien 65520 soit $FFF0.

    par contre pour une étendue supérieure là ca part en vrille !!

    @+

  5. #25
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-Bonjour,


    @Sjrd et @Claudius : Ok à propos des limites de mon alternative, faudrait que je complète par des tests pour voir jusqu'à quelles limites cela reste intéressant. J'ai utilisé du StringList par flemme et par souci de simplicité (mais j'ai en réserve le type tIntegerList) et dans l'attente cela peut rendre service pour des applis pas trop gourmandes.

    J'ai appris à utiliser les object's dans un bouquin et j'ai bien aimé le concept d'encapsulage. C'est vrai que cela date mais comme Delphi-5 accepte toujours cette syntaxe, réflexe de vieux, je continue à l'utiliser mais comme les class c'est presque kif-kif cela ne me gène pas de remplacer object par class. Par contre les class(QuelqueChose) je m'en méfie un peu car on hérite de trucs inconnus du QuelqueChose et cela me gêne en cas de bugs pour la recherche des causes.

    D'accord avec votre invitation à m'améliorer je ne suis pas du tout contre l'esprit du forum ... mais pour me mettre aussi à l'Asm faut que réfléchisse un peu car j'avais à une époque lointaine quelques routines en Asm qui fonctionnaient très bien jusqu'au jour où j'ai changé de version de Windows (passage au 32 bits) qui ne les a plus acceptées ... "chat échaudé craint l'eau froide" ... et quand on passera aux 64 bits ce sera rebolote

    Donc pour ce qui est de l'Asm je serais plutôt du genre à getter la nouvelle version de BigSetExample.pas peauffinée par les fortiches

    A+

  6. #26
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message

    J'ai utilisé du StringList par flemme et par souci de simplicité (mais j'ai en réserve le type tIntegerList) ...
    En regardant ton code j'ai moi aussi pensé à un TIntegerList

    Citation Envoyé par Gilbert Geyer Voir le message
    J'ai appris à utiliser les object's dans un bouquin et j'ai bien aimé le concept d'encapsulage. C'est vrai que cela date mais comme Delphi-5 accepte toujours cette syntaxe, ...
    C'est toujours d'actualité (D7 et même D2007): question de compatibilité ascendante.

    Citation Envoyé par Gilbert Geyer Voir le message
    Par contre les class(QuelqueChose) je m'en méfie un peu car on hérite de trucs inconnus du QuelqueChose et cela me gêne en cas de bugs pour la recherche des causes.
    C'est une question de pratique, on prend vite l'habitude d'isoler le problème dans la ou les classes parentes.

    Citation Envoyé par Gilbert Geyer Voir le message
    Donc pour ce qui est de l'Asm je serais plutôt du genre à getter la nouvelle version de BigSetExample.pas peauffinée par les fortiches
    Alors là je suis fait pour te comprendre.

    @+ Claudius

  7. #27
    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
    Citation Envoyé par Cl@udius Voir le message
    par contre pour une étendue supérieure là ca part en vrille !!
    Oui bien sûr c'est ce que je disais. $0000..$FFFF tient sur 2 octets. Donc il faut le MOVZX. Dès que tu passes plus haut, $0000..$10000, ça se range sur 4 octets, et alors il faut supprimer le MOVZX.

  8. #28
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Oui bien sûr c'est ce que je disais. $0000..$FFFF tient sur 2 octets. Donc il faut le MOVZX.
    Ah mais quel boulet je suis !!! Evidemment !

    Citation Envoyé par sjrd Voir le message
    Dès que tu passes plus haut, $0000..$10000, ça se range sur 4 octets, et alors il faut supprimer le MOVZX.
    On est bien d'accord.

    En tout cas ca marche nickel, et je vais pouvoir avancer.
    Merci encore.

    Vraiment intéressant ces class operator.

    @+ Claudius.

  9. #29
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-Bonjour,

    Décidémment je dois être nul : J'arrive plus à suivre, vous dites : "Donc il faut le MOVZX ... Evidemment !" suivi de "et alors il faut supprimer le MOVZX ... On est bien d'accord".
    Au final faut-il conserver ou supprimer le MOVZX puisque vous êtes d'accord avec les deux alternatives ?

    A+

  10. #30
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Au final faut-il conserver ou supprimer le MOVZX puisque vous êtes d'accord avec les deux alternatives ?
    Si ton type de base est sur 2 octets ($0000..$FFFF) il faut le MOVZX.
    Si l'étendue est supérieure il faut le supprimer.

    Pour ma part un codage sur 2 octets étant amplement suffisant j'ai laissé le MOVZX et défini le type de base ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      TBigValue = $0000..$FFFF;
    @+

  11. #31
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 871
    Points : 11 361
    Points
    11 361
    Billets dans le blog
    6
    Par défaut
    de mon côté, je me demandais si on ne pourrait pas utiliser un arbre binaire à 32 niveaux pour stocker les Cardinaux de l'ensemble, et leur attribuer un index dans un TBigValueSet qui représenterait l'ensemble lui-même

    cela promet d'être gourmand en mémoire, mais j'ai l'intuition qu'il doit exister une limite (que je ne sais pas calculer ;>} ) pour le coût de parcours d'un array par rapport à l'arbre...

    ceci pour cumuler les avantages d'étendue des éléments, et la performance du TBigValueSet, tout en préservant une certaine rapidité de recherche (au moins homogène) et un encombrement mémoire qui croît avec le nombre d'éléments, mais pas leur étendue.

    merci pour vos critiques éventuelles !

  12. #32
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut tourlourou
    Citation Envoyé par tourlourou Voir le message
    de mon côté, je me demandais si on ne pourrait pas utiliser un arbre binaire à 32 niveaux pour stocker les Cardinaux de l'ensemble, et leur attribuer un index dans un TBigValueSet qui représenterait l'ensemble lui-même
    Je dois t'avouer que ta notion d'arbre à 32 niveaux m'échappe un peu.

    Citation Envoyé par tourlourou Voir le message
    cela promet d'être gourmand en mémoire, mais j'ai l'intuition qu'il doit exister une limite (que je ne sais pas calculer ;>} ) pour le coût de parcours d'un array par rapport à l'arbre...
    A mon avis quelle que soit la méthode il y aura toujours un parcours qu'il faudra implémenter, et qui par nature sera 'lourde' dès que l'ensemble est important.

    Je te remercie de participer à cette discussion et il serait sympa que tu développes un peu plus ta notion d'arbre.
    Merci par avance.

    @+ Claudius.

  13. #33
    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
    Citation Envoyé par Cl@udius Voir le message
    Je te remercie de participer à cette discussion et il serait sympa que tu développes un peu plus ta notion d'arbre.
    +1, parce que j'ai rien compris

  14. #34
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 871
    Points : 11 361
    Points
    11 361
    Billets dans le blog
    6
    Par défaut
    je me doutais un peu que c'était nébuleux !!!

    pour répondre au problème de gestion d'ensembles d'assez grands nombres d'éléments (plus de 256) d'intervalles larges (mettons 32 bits), la solution du TBigValueSet présente le seul inconvénient de nécessiter une taille mémoire fixe, dépendant des bornes de l'intervalle (pe 512 Ko pour un TColor, qu'il y ait 1 élément dans l'ensemble, ou tous ceux possibles).

    la solution d'un tableau ouvert permet de ne stocker que les éléments de l'ensemble, mais oblige à un parcours (d'en moyenne, nb d'éléments/2) pour savoir si un élément est inclus, ce qui devient pê pénalisant pour de grands ensembles.

    j'essaye donc d'envisager une méthode qui combine l'efficacité du TBigValueSet et d'une recherche à coût constant.

    d'où l'idée d'un arbre binaire (ou octal, hexa...) dont le parcours se fait selon les bits (ou ensembles de bits) de la valeur à inclure et les feuilles contiennent l'index de l'élément dans le TBigValueSet (dimensionné à un nombre maximal d'éléments, et non plus à leur étendue).

    pour un arbre binaire, l'index se trouve après parcours de 32 noeuds/niveaux, quelque soit la valeur => coût constant

    l'inconvénient est de prendre beaucoup plus de place mémoire pour l'arbre que pour un tableau, mais de limiter celle dans le TBigValueSet.

    un autre inconvénient est de ne pas pouvoir récupérer aisément un index attribué à un élément retiré de l'ensemble pour un nouvel élément

    j'espère être plus clair (il paraît que ce qui se conçoit bien...)

    un moyen serait de comparer les solutions : TBigValueSet, Open Array, TStringList, et celle-ci, sur des exemples, en cherchant les limites.

  15. #35
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Un article intéressant sur le sujet, il me semble car je n'ai pas encore tout lu :
    An Extensive Examination of Data Structures
    Notamment l'implémentation des ensembles en C#.

    Bon dev

  16. #36
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Toujours dans le style système "D" voiçi une variante qui gère un ensemble de 65536 TColor planqué dans un BitMap où chaque nouvel élément-couleur est rangé directement dans la rangée d'indice = R = GetRValue(inVal) ce qui permet, lors de l'appel par if SetBmp.Contains(maCouleur), d'éviter à scanner la totalité du BitMap pour voir si oui ou non maCouleur est présente dans l'ensemble, ce qui associé à l'utilisation de ScanLine optimise bigrement la vitesse d'éxec (évite de ralentir par un facteur de 256).

    Pour son utilisation il faut savoir que dans le BitMap associé tous les pixels on par défaut une couleur égale à RGB(1,1,1) c'est à dire du quasi-noir sans être absolument noir ce qui permet de gérer un ensemble de toutes couleurs à l'exception de la RGB(1,1,1) qui est systématiquement présente dans la BitMap. (mais RGB(1,1,1) est tellement noir qu'on l'utilise pas : on prend directement du RGB(0,0,0)).

    Au fait, j'ai dû utiliser un "Object" ancestral because ayant voulu utiliser "Class" lors du close de l'appli Delphi-5 m'a toussé un message d'erreur : Je suppose que pour convertir mon object en class faudra que je fasse autre chose que de simplement remplacer Object par Class dans mon code que voiçi : testé il marche :
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
    //Pour simuler un gros Set de couleurs :
     
    type tSetBmpOfTColors = Object //Class
                                bmp : tBitMap; R,G,B : byte;
                                procedure Create;
                                procedure Add(inVal : TColor);
                                procedure Delete(inVal : TColor);
                                function  Contains(testVal : TColor) : boolean;
                                //procedure AddSet(inSet : tSetBmpOfTColors); <- à faire éventuellement Set1 = Set1 + Set2
                                procedure Free;
                            end;
     
    implementation
     
    {$R *.DFM}
     
    // Version Bmp :
     
    procedure tSetBmpOfTColors.Create;
    begin     Bmp:=tBitMap.create;
              with Bmp do
              begin height:=256; width:=256;
                    pixelFormat:=pf24bit;
                    Canvas.Brush.Color:=RGB(1,1,1);
                    Canvas.FillRect(Rect(0,0,width,height));
              end;
    end;
     
    type     tRGBTripleArray =  array [WORD] of tRGBTriple;
             pRGBTripleArray =  ^tRGBTripleArray;
     
    procedure tSetBmpOfTColors.Add(inVal : TColor);
    var       rangee:  pRGBTripleArray; i : integer;
    begin     R:=GetRValue(inVal);
              G:=GetGValue(inVal);
              B:=GetBValue(inVal);
              with bmp do
              begin rangee := Scanline[R]; // on range directement dans la ligne d'indice R
                    i:=-1;
                    repeat inc(i);
                    until (i=width-1)
                       or ((rangee[i].rgbtGreen=1) and (rangee[i].rgbtBlue=1))
                       or ((rangee[i].rgbtGreen=G) and (rangee[i].rgbtBlue=B));
                    rangee[i].rgbtRed:=R; rangee[i].rgbtGreen:=G; rangee[i].rgbtBlue:=B;
              end;
    end;
     
    procedure tSetBmpOfTColors.Delete(inVal : TColor);
    var       rangee:  pRGBTripleArray; i : integer;
    begin     R:=GetRValue(inVal);
              G:=GetGValue(inVal);
              B:=GetBValue(inVal);
              with bmp do
              begin rangee := Scanline[R]; // on va directement dans la ligne d'indice R
                    i:=0;
                    while (i<width-1) and (rangee[i].rgbtGreen<>G) and (rangee[i].rgbtBlue<>B)
                       do inc(i);
                    rangee[i].rgbtRed:=1; rangee[i].rgbtGreen:=1; rangee[i].rgbtBlue:=1;
              end;
    end;
     
    function  tSetBmpOfTColors.Contains(testVal : TColor) : boolean;
    var       rangee:  pRGBTripleArray; i : integer;
    begin     R:=GetRValue(testVal);
              G:=GetGValue(testVal);
              B:=GetBValue(testVal);
              with bmp do
              begin rangee := Scanline[R]; // on saute directement sur la ligne d'indice R
                    i:=-1;
                    repeat inc(i);
                           if  (rangee[i].rgbtGreen = G)
                           and (rangee[i].rgbtBlue  = B)
                           and (rangee[i].rgbtRed   = R)
                           then begin RESULT:=true; EXIT; end;
                    until (i=width-1);
              end;
              RESULT:=false;
    end;
     
    procedure tSetBmpOfTColors.Free;
    begin     Bmp.Free; end;
     
    // Utilisation version Bmp
     
    procedure TfrmSetOf.bSetBmpClick(Sender: TObject);
    var       SetBmp : tSetBmpOfTColors;
    begin     memo1.clear;
              SetBmp.Create;
              SetBmp.Add(clGreen);
              SetBmp.Add(clRed);
              SetBmp.Add(RGB(44,255,22));
              SetBmp.Add(RGB(255,255,22));
              SetBmp.Add(clLime);
              SetBmp.Add(RGB(255,128,255));
     
              if SetBmp.Contains(clRed)  then showMessage('1 : Rouge présent : ok')
                                         else showMessage('1 : Rouge absent');
     
              if SetBmp.Contains(clGreen)  then showMessage('1 : Vert présent : ok')
                                           else showMessage('1 : Vert absent');
     
              if SetBmp.Contains(clYellow) then showMessage('2 : Jaune présent')
                                           else showMessage('2 : Jaune absent : ok');
              SetBmp.Add(clYellow);
              if SetBmp.Contains(clYellow) then showMessage('3 : Jaune présent : ok')
                                           else showMessage('3 : Jaune absent');
     
              if SetBmp.Contains(RGB(43,255,22)) then showMessage('4 : 43,255,22 présent')
                                                 else showMessage('4 : 43,255,22 absent : ok');
     
              if SetBmp.Contains(RGB(44,255,22)) then showMessage('5 : 44,255,22 présent : ok')
                                                 else showMessage('5 : 44,255,22 absent');
     
              SetBmp.Delete(clRed);
              if SetBmp.Contains(clRed)  then showMessage('6 : Rouge présent')
                                         else showMessage('6 : Rouge absent : ok');
     
              if SetBmp.Contains(clYellow) then showMessage('7 : Jaune présent : ok')
                                           else showMessage('7 : Jaune absent');
     
              SetBmp.Free;
    end;
    Bon, vous me direz que cela utilise de la mémoire, mais comme les bécanes de nos jours ont de grosses mémoires autant les utiliser.
    A+

  17. #37
    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
    @Tourlourou :
    Je comprends mieux ton idée. En fait il s'agit de faire un tableau des éléments, mais hashé

    Perso je me suis penché sur l'écriture d'un ensemble représenté par un unique tableau dynamique, mais trié. Avec un algorithme de recherche O(log n), dichotomique, avec n le nombre d'éléments dans l'ensemble.

    L'inclusion et l'exclusion sont relativement lentes. Mais le test est relativement rapide, et les union, soustraction et intersection sont O(m+n), avec m et n les nombres d'éléments des deux ensembles.

    C'est joint à ce message

    Tourlourou, si tu veux implémenter ton idée, je te conseille de développer ta solution en utilisant un TBasicIntSet pour chaque "boîte" de la table de hashage. Cela devrait faire un bon rendement.
    Fichiers attachés Fichiers attachés

  18. #38
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Un Arbre pour le Comptage de Couleur avait proposé, il me semble récemment sur le forum ... ICI, tient déjà un sujet avec Toulourou, je recherche ce sujet avec l'arbre ...

  19. #39
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    A Sjrd : J'ai voulu tester IntegerSets.pas mais d'entrée de jeu Delphi me répond par une liste d'erreurs commençant par [Erreur] IntegerSets.pas(17): ',' ou ':' attendu(e) mais identificateur 'FItems' trouvé(e)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TBasicIntSet = record
      private
        FItems: array of Integer; /// Éléments       <------- Ligne 17
        FCount: Integer;          /// Nombre d'éléments
    Et si je remplace à la ligne 15 "record" par "class" c'est à partir de la ligne 36 que Delphi me tousse [Erreur] IntegerSets.pas(36): PROCEDURE ou FUNCTION attendu
    Ligne 36 : class operator Add(const Left, Right: TBasicIntSet): TBasicIntSet;

    Cela provient-il du fait que j'utilise Delphi 5 ?

    A+

  20. #40
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Oui, les record en BSD sont devenu des classes déguisées ...

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

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. set term ^
    Par tux dans le forum Débuter
    Réponses: 8
    Dernier message: 12/10/2004, 20h42
  3. IB 6.0.1 - Win XP - Character Set
    Par SuperTotor dans le forum InterBase
    Réponses: 4
    Dernier message: 03/06/2003, 20h25
  4. Query data set
    Par Sandra dans le forum JBuilder
    Réponses: 3
    Dernier message: 20/01/2003, 10h08
  5. character set // Nls_lang
    Par fopicht dans le forum Oracle
    Réponses: 2
    Dernier message: 23/05/2002, 12h04

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