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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    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 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    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 086
    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 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
    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 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    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 Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    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 086
    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
    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
    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.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    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 .

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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    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 .

  12. #12
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    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.

  13. #13
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    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!

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    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...

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