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 :

Enuméré et ensemble


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 59
    Points
    59
    Par défaut Enuméré et ensemble
    Bonjour,
    J'ai défini un type:
    TypeTruc = (machin1, machin2, machin3, machin4);
    et une étendue
    Truc = Set of TypeTruc;

    Je voudrais faire une méthode qui, à partir d'un entier, me renvoie le Truc rempli correctement (en gros pour que Truc corresponde à un énuméré de type Flags C#). Ma méthode fonctionne mais actuellement je suis obligé de renseigner en dur le nombre de valeur possible de mon TypeTruc (ici 4).
    J'aimerais savoir comment faire pour connaitre le nombre de valeur possible de mon TypeTruc???

    Merci d'avance

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 740
    Points : 13 285
    Points
    13 285
    Par défaut
    Il suffit de transtyper en byte à l'écriture et en Truc à la lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    v1 :Truc;
    v2 :byte;
     
    v2 := byte(v1);
    v1 := truc(v2);

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 519
    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 519
    Points : 25 037
    Points
    25 037
    Par défaut
    la fonction Ord est plus "propre" que le transtypage en Byte mais c'est équivalent !
    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 é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
    Et, pour la forme, on appelle ça un type ensemble. Pas un type étendue. Un type étendue c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TSomeInterval = machin2..machin3;
    Du coup j'ai changé le titre
    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
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 740
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 740
    Points : 13 285
    Points
    13 285
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    la fonction Ord est plus "propre" que le transtypage en Byte mais c'est équivalent !
    Non, ce n'est pas équivalent .

    ord renvoi l'indice d'un élément TypeTruc mais n'est pas applicable sur l'ensemble Truc qui en contient plusieurs.

  6. #6
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    petite précision, il faut transtyper truc en
    • Byte si TypeTruc contient <= 8 éléments
    • Word si TypeTruc contient <= 16 éléments
    • Cardinal si TypeTruc contient <= 32 éléments

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 519
    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 519
    Points : 25 037
    Points
    25 037
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Non, ce n'est pas équivalent .

    ord renvoi l'indice d'un élément TypeTruc mais n'est pas applicable sur l'ensemble Truc qui en contient plusieurs.
    Oui, j'ai confondu Truc et TypeTruc ... Ord c'est uniquement pour TypeTruc !

    Sinon, voir ce sujet Récupérer le 1° élément d'un SET OF
    la taille d'un ensemble peut monter à 32 Octets !

    tu peux écrire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Truc: record
      case Integer of
        0: (Flags: set of TypeTruc);
        1: (Bin: Byte);
    end;
    Pour savoir le nombre de combinaison, rien de plus facile, c'est 2 puissance n
    n étant le nombre de valeur dans l'énumération ...
    1 = 2
    2 = 4
    3 = 8
    4 = 16
    ... normalement, tout informaticien connait !
    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

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 59
    Points
    59
    Par défaut
    Merci pour vos réponse mais je ne sais pas si j'ai été très clair, en gros je voudrais un moyen de connaitre le nombre de valeurs possible d'un énuméré.

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 519
    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 519
    Points : 25 037
    Points
    25 037
    Par défaut
    Ah ! On avait pas compris que ta question effectivement était si simple, ben oui, comment pourrait-on penser que tu poses une question sans avoir lu l'aide de Delphi
    Citation Envoyé par Aide
    L'étendue d'un type ensemble est l'ensemble puissance d'un type scalaire particulier, appelé le type de base ; c'est à dire que les valeurs possibles du type ensemble sont tous les sous-ensembles du type de base, y compris l'ensemble vide. Le type de base ne peut avoir plus de 256 valeurs possibles et leur rang doit être compris entre 0 et 255.
    Un Type Enuméré peut avoir autant de valeur que possible (4 milliards ?)
    Un Type Enuméré utilisé dans un Ensemble ne peut avoir que 256 valeurs
    Un Type Enuméré est un Type Scalaire, tu peux donc utiliser Ord, Succ, Pred, Low et High dessus ! Voir l'aide !

    vu que la taille maximale d'un set c'est 32 octets donc 256 bit donc 256 valeurs !

    Je pense que tu aurais eu la réponse plus vite en testant, tu aurais créer un type énuméré avec Excel pour incrémenter, en 30 secondes tu aurais trouver la réponse ! Moi c'est ce que j'ai fait quand j'ai voulu tester ma fonction SizeOfSetShai !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type
    TValeur =
      (Valeur1, Valeur2, Valeur3, ..., Valeur280, Valeur281); // Une Enum peut dépassé les 256 éléments;
     
    TValeurs = set of TValeur; // Les ensembles SET ont au plus 256 éléments;
    Tient une FAQ aussi
    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

  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
    Citation Envoyé par ludogoal Voir le message
    J'aimerais savoir comment faire pour connaitre le nombre de valeur possible de mon TypeTruc???
    Tu peux avoir la plus grande valeur avec High(TypeTruc). Plus qu'à transtyper, avec Ord(), et +1, et tu as le nombre de valeurs :
    Si tu veux faire une boucle sur toutes les valeurs possibles, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      Truc: TypeTruc;
     
    for Truc := Low(TypeTruc) to High(TypeTruc) do
      // ici tu utilises Truc
    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
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 740
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 740
    Points : 13 285
    Points
    13 285
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Tu peux avoir la plus grande valeur avec High(TypeTruc). Plus qu'à transtyper, avec Ord(), et +1, et tu as le nombre de valeurs
    Pour autant que les indices se suivent !

    Ceci TypeTruc = (machin1, machin2=10, machin3) donne 12 alors qu'il n'y a que 3 éléments .

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Tu peux avoir la plus grande valeur avec High(TypeTruc). Plus qu'à transtyper, avec Ord(), et +1, et tu as le nombre de valeurs :
    Si tu veux faire une boucle sur toutes les valeurs possibles, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      Truc: TypeTruc;
     
    for Truc := Low(TypeTruc) to High(TypeTruc) do
      // ici tu utilises Truc
    Merci, ça marche parfaitement!!!
    Pour les 256 éléments, je préfère ne rien dire...

  13. #13
    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 Andnotor Voir le message
    Pour autant que les indices se suivent !

    Ceci TypeTruc = (machin1, machin2=10, machin3) donne 12 alors qu'il n'y a que 3 éléments .
    Certes, mais combien de fois n'ai-je pas dit qu'il ne fallait surtout pas utiliser cette construction du langage ?
    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.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 740
    Points : 13 285
    Points
    13 285
    Par défaut
    Elle est pourtant bien pratique lorsqu'on veut sauver l'ensemble dans un fichier tout en permettant l'ajout d'éléments en concervant un ordre logique d'écriture .

    S'il n'y a pas de sauvegarde/chargement, elle n'a en effet aucun intérêt .

  15. #15
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 945
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 945
    Points : 5 659
    Points
    5 659
    Par défaut
    Qoi,
    Citation Envoyé par Andnotor Voir le message
    Elle est pourtant bien pratique lorsqu'on veut sauver l'ensemble dans un fichier tout en permettant l'ajout d'éléments en concervant un ordre logique d'écriture
    Peut-être, mais c'est aussi un piège dans lequel il est aisé de tomber.

    Pour prendre l'exemple déjà cité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeTruc = (machin1, machin2=10, machin3);
    Tu pourras utiliser une valeur qui n'existe pas, disons 4, sans que le programme te jette pour utilisation d'une valeur non déclarée, car elle entre dans la gamme des valeurs considérées comme valides, soit 0 à 11 pour cet exemple.
    C'est carrément casse gueule, et est donc à éviter, ce qui rejoint ce que dit sjrd.
    Si les cons volaient, il ferait nuit à midi.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 740
    Points : 13 285
    Points
    13 285
    Par défaut
    Citation Envoyé par droggo Voir le message
    ...C'est carrément casse gueule, et est donc à éviter, ce qui rejoint ce que dit sjrd.
    Dans ton code, tu feras toujours un test sur Machin1 et non sur TypeTruc(1). C'est casse-gueule uniquement dans le cas de boucle comme cité précédemment . Et encore, des tests case ou in n'y verront que du feu !

    ps: Je n'ai d'ailleurs pas bien compris la finalité de déterminer le nombre d'éléments utilisables sans savoir ce qu'ils représentent et donc comment ils sont interprétés .

  17. #17
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Certes, mais combien de fois n'ai-je pas dit qu'il ne fallait surtout pas utiliser cette construction du langage ?
    ça dépend l'utilisation.

    c'est comme faire de l'assembleur inline, peu conseillé ... sauf si on sais ce que l'on fait.

    c'est utile par exemple pour les flags ou les paramètres que l'on ne veux surtout pas en constante (bien qu'a partir de D2009 on puisse definir des groupes de constantes ce qui est mieux et plus souple).

    exemple :

    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
     
    {$X+} {$ALIGN ON} {$MINENUMSIZE 4}
    type
      TFlag = (
        fRGB1x = $00,
        fRGB4x = $01,
        fRGB8x = $02,
        fRGB16x = $08,
        fARGB1x = $20,
        fARGB4x = $21,
        fARGB8x = $22,
        fARGB16x = $28,
      );
     
    function DropColor(P:Pointer; Flag: TFlag); stdcall;
     
    // appel
     
    DropColor(@B, fARGB16x);
    et ce je prefere :

    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
     
    type
      TFlag = type LongWord;
     
      TFlags = packed record
      public
        const RGB1x : TFlag = $00;
        const RGB4x : TFlag = $01;
        const RGB8x : TFlag = $02;
        const RGB16x : TFlag = $08;
        const ARGB1x : TFlag = $20;
        const ARGB4x : TFlag = $21;
        const ARGB8x : TFlag = $22;
        const ARGB16x : TFlag = $28;
      end;
     
    function DropColor(p: pointer; Flag: TFlag); stdcall;
     
    // appel
    DropColor(@B, TFlags.ARGB16x);
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

Discussions similaires

  1. Enumérer tous les sous-ensembles à k éléments parmi n
    Par HelloThury dans le forum Calcul scientifique
    Réponses: 6
    Dernier message: 28/06/2015, 12h39
  2. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07
  3. [Kylix] ensemble
    Par chico dans le forum EDI
    Réponses: 3
    Dernier message: 17/07/2002, 12h22
  4. Réponses: 3
    Dernier message: 12/06/2002, 19h03

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