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. #1
    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 Alternative à un Set Of
    Salut

    Voilà, j'ai pris l'habitude de travailler avec des constantes énumérées ainsi qu'avec des ensembles (set of).

    Exemple bateau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      Type
        TCouleur = (coBlanc, coBleu, coRouge, coVert, coNoir);
        TCouleurs = set of TCouleur;
    Seulement dans le cas présent mon type de base possède plus de 256 valeurs, donc me voilà dans l'incapacité de définir un ensemble.

    Quelle alternative choisieriez-vous ? Un array ?

    @+ Claudius

  2. #2
    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,

    Tout dépend de l'utilisation qui en est envisagé :
    - comme le TColor est en fait un Integer je prendrais un array,
    - je prendrais également un array pour un ensemble de valeurs numériques entre lesquelles il est envisagé de faire opérations de calcul,
    - et s'il s'agit d'un ensemble de mots je prendrais plutôt une tStringList s'il faut pouvoir faire ensuite un Case maListe.indexOf(mot) Of ....

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    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 Gilbert

    En fait je ne fait pas de calcul.
    Je cherche une alternative simple à l'opérateur IN des ensembles, genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      if MaCouleur in MesCouleurs then 
        // ...
    Scanner un tableau dans ce cas, je trouve ça un peu lourd.

    Quant à choisir un TStringList, donc transformer mes valeurs ordinales en chaînes de caractères, euh pas terrible non plus.

    Mais plus je me creuse, et moins je vois d'alernative.

    @+ Claudius

  4. #4
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    a première vue le tableau et la seule alternative le mieux sera d'ajouter quelque procédures (ajout, suppression, dedans...) pour une maniabilité similaire aux ensembles

  5. #5
    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 Aityahia

    Citation Envoyé par aityahia Voir le message
    a première vue le tableau et la seule alternative..
    Je crois que vais devoir en passer par là.
    J'avais espéré une solution miracle à laquelle je n'aurais pas pensé, mais bon tant pis.

    Merci pour vos réactions.

    @+ Claudius

  6. #6
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Salut Gilbert

    En fait je ne fait pas de calcul.
    Je cherche une alternative simple à l'opérateur IN des ensembles, genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      if MaCouleur in MesCouleurs then 
        // ...
    Scanner un tableau dans ce cas, je trouve ça un peu lourd.

    Quant à choisir un TStringList, donc transformer mes valeurs ordinales en chaînes de caractères, euh pas terrible non plus.

    Mais plus je me creuse, et moins je vois d'alernative.

    @+ Claudius
    Fractionner votre ensemble en deux ne vous arrange pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (MaCouleur in MesCouleurs_part1) Or (MaCouleur in MesCouleurs_part2) then

  7. #7
    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 aityahia Voir le message
    Fractionner votre ensemble en deux ne vous arrange pas
    Euh non malheureusement ce n'est pas du tout envisageable !
    Ca me ferait reprendre une trop grande partie de mon code.

    Mais ce n'était pas une mauvaise idée.

  8. #8
    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
    Ton code, tu vas de toutes façons devoir le reprendre. Aussi je te conseille de faire ce que t'a proposé aityahia, mais encapsulé dans un record (si tu as D2005 au moins) ou dans une classe (dans le cas contraire).

    Je te fais un exemple dans l'heure.
    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.

  9. #9
    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
    Je te fais un exemple dans l'heure.
    Je te remercie, mais il n'y a pas le feu, c'est le week-end !!

  10. #10
    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
    Bon zut j'ai un peu de retard Mais j'ai voulu faire ça bien. C'est en attaché.

    Les parties avec des class operator ne fonctionnent qu'avec D2006, mais si tu les enlèves c'est utilisable avec D2005.

    Voici un code de test :
    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
    procedure TestSets;
    var
      BigValues, BigValues2: TBigValueSet;
    begin
      BigValues := TBigValueSet.Create([34, 300]);
      WriteLn(BigValueSetToString(BigValues));
     
      BigValues2 := BigValues + TBigValueSet.Create([430, 63, 54]);
      WriteLn(BigValueSetToString(BigValues2));
     
      BigValues.Include(30);
      BigValues2 := BigValues * BigValues2;
      WriteLn(BigValueSetToString(BigValues2));
     
      BigValues.Substract(TBigValueSet.Create([54, 300]));
      WriteLn(BigValueSetToString(BigValues));
    end;
    Fichiers attachés Fichiers attachés
    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.

  11. #11
    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
    Merci Seb

    Citation Envoyé par sjrd Voir le message
    Les parties avec des class operator ne fonctionnent qu'avec D2006, mais si tu les enlèves c'est utilisable avec D2005.
    J'ai D7 et D2007 sur mon poste. Mais je suppose que les class operator fonctionnent également sous D2007. Je n'ai pas encore fait joujou avec ces bêtes là !

    Je regarde tout ca avec attention, et te tiens au courant.
    @+ Claudius

  12. #12
    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
    Citation Envoyé par Cl@udius
    Je n'ai pas encore fait joujou avec ces bêtes là !
    J'ai un tutoriel en cours de rédaction sur le sujet, j'essaie de le finaliser rapidement.

    [Mode apparté]
    Sinon le code de Sjrd est une très bonne solution, il lui manque, à mon avis, qq commentaires pour qu'elle soit excellente
    Citation Envoyé par sjrd
    Mais j'ai voulu faire ça bien.
    Je pense qu'il faut que tu passes au tricot pour te voir faire qq chose de travers

  13. #13
    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

    Citation Envoyé par Laurent Dardenne Voir le message
    J'ai un tutoriel en cours de rédaction sur le sujet, j'essaie de le finaliser rapidement.
    Effectivement je pêche sur ce sujet, ravi d'apprendre que tu prepares un tuto.

    Citation Envoyé par Laurent Dardenne Voir le message
    [Mode apparté]...
    Je pense qu'il faut que tu passes au tricot pour te voir faire qq chose de travers


    @+ Claudius

  14. #14
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    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 862
    Points : 11 330
    Points
    11 330
    Billets dans le blog
    6
    Par défaut
    effectivement, c'est beau !

    cela permet effectivement de dépasser une étendue de 256, mais pour des TColor, constituer un Set de couleurs allant du blanc au noir nécessite 512 Ko !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  15. #15
    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
    Merci Seb
    Avec plaisir, ça me permet de me faire de l'exercice avec les record avancés
    Citation Envoyé par Cl@udius Voir le message
    J'ai D7 et D2007 sur mon poste. Mais je suppose que les class operator fonctionnent également sous D2007. Je n'ai pas encore fait joujou avec ces bêtes là !
    Oui bien sûr ça fonctionne tout aussi bien avec D2007.
    Citation Envoyé par Laurent Dardenne Voir le message
    J'ai un tutoriel en cours de rédaction sur le sujet, j'essaie de le finaliser rapidement.
    Ca pourra faire un autre exemple pour ton tuto, non ?
    Citation Envoyé par Laurent Dardenne Voir le message
    Sinon le code de Sjrd est une très bonne solution, il lui manque, à mon avis, qq commentaires pour qu'elle soit excellente
    Mis à jour avec des commentaires.
    Citation Envoyé par tourlourou Voir le message
    effectivement, c'est beau !
    Honnêtement, je trouve aussi

    Citation Envoyé par tourlourou Voir le message
    cela permet effectivement de dépasser une étendue de 256, mais pour des TColor, constituer un Set de couleurs allant du blanc au noir nécessite 512 Ko !
    Oui, évidemment, ce n'est pas adapté à de trop grands ensembles.

    Une alternative dans ce cas serait d'enregistrer des intervalles de valeurs que contient l'ensemble. Ce serait aussi indispensable si on devait travailler avec des valeurs réelles, d'ailleurs.

    Mais j'avais cru comprendre que le problème de Claudius n'impliquait pas des types à étendue si large, donc j'ai fait comme ça.
    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.

  16. #16
    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
    Bonjour

    @sjrd

    J'ai examiné ton BigSet c'est très très intéressant.
    Les parties de code en asm m'échappe totalement, mais cela reste très intructif.

    Merci encore

    Cependant j'ai une belle AV sur le Include(30) !
    [edit]
    Ce qui est particulièrement étrange puisque l'Include du TBigValueSet.Create fonctionne correctement !

    @+ Claudius

  17. #17
    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
    Les parties de code en asm m'échappe totalement, mais cela reste très intructif.
    C'est compréhensible

    Pour Include et Exclude, les instructions BTS et BTR positionnent respectivement à 1 et à 0 le ième bit d'une plage mémoire. i est le second argument, à savoir EDX. Comme les commentaires l'indiquent, EDX contient la valeur de Value. Si Value est une énumération, EDX contient sa valeur ordinale, donc ça marche tout aussi bien
    Le premier argument, [EAX], désigne la plage mémoire pointée par EAX. Comme les commentaires l'indiquent, EAX est l'adresse du record avancé.

    Pour Exists, BT fonctionne avec le même type d'argument que BTS et BTR, mais place dans le flag CF la valeur du bit, au lieu de le modifier. Pour placer cette valeur de CF dans la variable Result, qui est en fait AL, on utilise SETB.

    L'équivalent en pur Pascal est faisable, mais tellement plus compliqué que ces 4 instructions ASM que son utilisation est vraiment très intéressante

    Citation Envoyé par Cl@udius Voir le message
    Cependant j'ai une belle AV sur le Include(30) !
    Euh, chez moi ça fonctionne sans problème. J'avais testé le code de test avant de te le donner.

    Tu exécutes exactement ce que je t'ai donné ? Ou t'as légèrement modifié ?

    Edit : j'ai tracé l'exécution en assembleur, j'ai repéré le problème. Je le corrige ASAP.
    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.

  18. #18
    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,

    En guise de variation sur un même thème voiçi deux approches plus modestes que celle de Sjrd (j'ai essayé de piger en vain : trop fortiche pour moi) mais qui marchent également (variantes style "système D" pour Delphi-5) :

    1) Pour du Cardinal :
    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
     
    type tGrosSetOfCardinal	= Object
                                SL : tStringList;
                                procedure Create;
                                procedure Add(inVal : Cardinal);
                                procedure Delete(inVal : Cardinal);
                                function  Contains(testVal : Cardinal) : boolean; // pour remplacer les if MaCouleur in MesCouleurs then 
                                procedure AddSet(inSet : tGrosSetOfCardinal);
                                procedure Free;
                          end;
     
    implementation
     
    {$R *.DFM}
     
    procedure tGrosSetOfCardinal.Create;
    begin     SL:=tStringList.create;
              with SL do begin Sorted:=true; Duplicates:=dupIgnore; end;
    end;
     
    procedure tGrosSetOfCardinal.Add(inVal : Cardinal);
    begin     SL.Add(intToStr(inVal)); end;
     
    procedure tGrosSetOfCardinal.Delete(inVal : Cardinal);
    var       indice : integer;
    begin     indice:=SL.IndexOf(intToStr(inVal));
              if indice>=0 then SL.Delete(indice); end;
     
    function  tGrosSetOfCardinal.Contains(testVal : Cardinal) : boolean;
    begin     Result:=SL.IndexOf(intToStr(testVal))>=0; end;
     
    procedure tGrosSetOfCardinal.Free;
    begin     SL.Free; end;
     
    procedure tGrosSetOfCardinal.AddSet(inSet : tGrosSetOfCardinal);
    //            Ajout à GrosSet de inSet soit Set1 = Set1 + Set2
    begin     SL.AddStrings(inSet.SL); end;
     
    // Utilisation -------------------------------------------------
     
    const     coNoir = 0; coBlanc = 1; coBleu = 2; coRouge=3; coVert = 4;
     
    procedure TForm1.bSetOfCardinalClick(Sender: TObject);
    var       Set1,Set2 : tGrosSetOfCardinal; i : integer;
    begin     with Set1 do
              begin Create;
                    Add(coNoir); Add(coVert); Add(coBleu); Add(coRouge); Add(coBlanc);
              end;
              if Set1.Contains(coVert) then ShowMessage('1 coVert in Set1 : ok')
                                       else ShowMessage('1 coVert not in Set1');
              with Set2 do
              begin Create;
                    for i:=coVert+1 to 2000 do Add(i);
              end;
              if Set2.Contains(coVert) then ShowMessage('2 coVert in Set1')
                                       else ShowMessage('2 coVert not in Set1 : ok');
              // Set1 = Set1 + Set2
              Set1.AddSet(Set2);
              if Set1.Contains(coVert) then ShowMessage('3 coVert in Set1 : ok')
                                       else ShowMessage('3 coVert not in Set1');
              Set1.Delete(coVert);
              if Set1.Contains(coVert) then ShowMessage('4 coVert in Set1')
                                       else ShowMessage('4 coVert not in Set1 : ok');
              Set1.free;
              Set2.free;
    end;
    2) Pour du TColor :
    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
     
    type tGrosSetOfTColors = Object
                                SL : tStringList;
                                procedure Create;
                                procedure Add(inVal : TColor);
                                procedure Delete(inVal : TColor);
                                function  Contains(testVal : TColor) : boolean; // pour remplacer les if MaCouleur in MesCouleurs then 
                                procedure AddSet(inSet : tGrosSetOfTColors);
                                procedure Free;
                          end;
     
    implementation
     
    {$R *.DFM}
     
    procedure tGrosSetOfTColors.Create;
    begin     SL:=tStringList.create;
              with SL do begin Sorted:=true; Duplicates:=dupIgnore; end;
    end;
     
    procedure tGrosSetOfTColors.Add(inVal : TColor);
    begin     SL.Add(IntToStr(inVal)); end;
     
    procedure tGrosSetOfTColors.Delete(inVal : TColor);
    var       indice : integer;
    begin     indice:=SL.IndexOf(IntToStr(inVal));
              if indice>=0 then SL.Delete(indice); end;
     
    function  tGrosSetOfTColors.Contains(testVal : TColor) : boolean;
    begin     Result:=SL.IndexOf(IntToStr(testVal))>=0; end;
     
    procedure tGrosSetOfTColors.AddSet(inSet : tGrosSetOfTColors);
    //            Ajout à GrosSet de inSet soit Set1 = Set1 + Set2
    begin     SL.AddStrings(inSet.SL); end;
     
    procedure tGrosSetOfTColors.Free;
    begin     SL.Free; end;
     
    // Utilisation -------------------------------------------------
     
    procedure TForm1.bSetOfColorsClick(Sender: TObject);
    var       Set1,Set2 : tGrosSetOfTColors; i : integer;
    begin     with Set1 do
              begin Create;
                    Add(clBlack); Add(clGreen); Add(clBlue); Add(clRed); Add(clWhite);
              end;
              if Set1.Contains(clGreen) then ShowMessage('1 clGreen in Set1 : ok')
                                        else ShowMessage('1 clGreen not in Set1');
              with Set2 do
              begin Create;
                    for i:=clGreen+1 to clGreen+2000 do Add(i);
              end;
              if Set2.Contains(coVert) then ShowMessage('2 clGreen in Set1')
                                       else ShowMessage('2 clGreen not in Set1 : ok');
              // Addition des deux ensembles : Set1 = Set1 + Set2
              Set1.AddSet(Set2);
              if Set1.Contains(clGreen) then ShowMessage('3 clGreen in Set1 : ok')
                                        else ShowMessage('3 clGreen not in Set1');
              Set1.Delete(RGB(0,128,0)); //=clGreen
              if Set1.Contains(clGreen) then ShowMessage('4 clGreen in Set1')
                                        else ShowMessage('4 clGreen not in Set1 : ok');
              Set1.free;
              Set2.free;
    end;
    3) Remarque 1: L'implémentation de l'object tGrosSetOfTColors est très proche de celui de l'object tGrosSetOfCardinal vu que le TColor est en fait un Integer (même pas été obligé de remplacer les IntToStr par des ColorToStr).

    4) Remarque 2: Pour des ensembles de Couleurs très volumineux il faudrait carrément stocker chaque ensemble dans un BitMap et remplacer SL.IndexOf par la recherche d'indice via un scann des ScanLines.

    A+

    EDIT : Posts croisés
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  19. #19
    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
    Re,

    Faudrait qu'un jour je me mette à l'asm. Mais je dois avouer que je manque de courage

    Citation Envoyé par sjrd Voir le message
    Tu exécutes exactement ce que je t'ai donné ? Ou t'as légèrement modifié ?
    Je n'ai rien changé, pas une ligne ni même un caractère.

    [EDIT]
    Citation Envoyé par sjrd Voir le message
    Edit : j'ai tracé l'exécution en assembleur, j'ai repéré le problème. Je le corrige ASAP.
    Post croisé ! OK merci.

    @+

  20. #20
    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
    Voilà j'ai re-mis à jour. Il fallait rajouter un MOVZX EDX,DX au début de chaque routine ASM. Parce qu'en fait, comme TBigValue est stocké sur 2 octets, il n'est passé que dans DX, et les 2 octets de poids fort de EDX sont indéterminés.

    Chez moi ceux-ci valaient "par chance" 0, donc ça passait. Mais apparemment chez toi pas. En forçant EDX à $00010000 avant l'appel à Include, j'avais effectivement la même AV.

    J'ai bien essayé BTS [EAX],DX qui aurait dû fonctionner, mais il semble que BASM (le compilo d'ASM en ligne) le transforme quand même en BTS [EAX],EDX. Donc j'ai plutôt utilisé MOVZX
    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
    procedure TBigValueSet.Include(Value: TBigValue);
    asm
            { -> EAX        Address of the TBigValueSet record
                 DX         Value to include                   }
            MOVZX   EDX,DX
            BTS     [EAX],EDX
    end;
     
    procedure TBigValueSet.Exclude(Value: TBigValue);
    asm
            { -> EAX        Address of the TBigValueSet record
                 DX         Value to exclude                   }
            MOVZX   EDX,DX
            BTR     [EAX],EDX
    end;
     
    function TBigValueSet.Exists(Value: TBigValue): Boolean;
    asm
            { -> EAX        Address of the TBigValueSet record
                 DX         Value to test
              <- AL         Result                             }
            MOVZX   EDX,DX
            BT      [EAX],EDX
            SETB    AL
    end;
    Attention ! Si le type que tu utilises en vrai à la place de TBigValue est stocké sur 4 octets, il ne faut pas mettre ce MOVZX !
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 5 12345 DernièreDernière

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