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

Delphi Discussion :

Comment obtenir le nombre d'éléments d'un ensemble set of TType ?


Sujet :

Delphi

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Comment obtenir le nombre d'éléments d'un ensemble set of TType ?
    Bonjour
    J'utilise Delphi 7
    Je voudrais savoir s'il est possible de déterminer directement le nombre d'éléments d'un ensemble défini par
    const NTaille = un entier de 10 à 100;
    type TIntervalle = [1..NTaille];
    var UnEnsemble : set of TIntervalle;

    sans avoir à utiliser les deux méthodes suivantes:
    1) tester un par un les NTaille éléments possibles;
    2) suivre éléments par élément les opérations successives d'intersection et de réunion.


    je connais les procédures optimisées include et exclude mais je n'ai pas trouvé de fonction "nombre d'éléments"
    Merci d'avance.

  2. #2
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Si je ne m'abuse

    doit répondre a ton besoin.

    a+
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour la réponse mais...
    high donne la borne supérieure des indices d’un tableau
    Si j’utilise le code suivant, j’obtiens une erreur de types incompatibles

    var I: Integer;

    UnEnsemble := [1,2,5,7];
    I:= high(UnEnsemble);

    Je voudrais avoir I = 4, nombre d’éléments de UnEnsemble.

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    teste cette partie de code :

    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
    type
      Tintervalle = (un,deux,trois,quatre,cinq);
      Tensemble = set of TIntervalle;
     
    var
      ensemble: Tensemble;
      intervalle: Tintervalle;
     
    .........
     
    var count: integer;
    begin
      count:= 0;
     ensemble := [un,deux,cinq];
      for intervalle in ensemble do inc(count);
      showMessage(intToStr(count));
    end;
    Te renverra la valeur 3, nombres cardinal de l'ensemble 'ensemble'
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup,
    c'est exactement ce qu'il me faut.
    J'avais bien pensé à with mais pas à for ... in
    j'ai encore une erreur de compilation:
    "La variable de contrôle de boucle FOR doit être une variable locale simple"

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 920
    Points
    3 920
    Par défaut
    La réponse donnée par Pascal est valable en .Net pas avec Delphi 7 (win 32).

    Il n'y a pas de construction toute faite pour ton problème. Moralité (ou immoralité de Delphi ;-) : il faut coder !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    type
     TIntervalle = 1..NTaille;
     TEnsemble: set of TIntervalle;
     
    function Cardinalite(Ens: Tensemble);
    var 
      Elm : TIntervalle;
    begin
      Result := 0;
      for Elm := Low(TIntervalle) to High(TIntervalle) do
        Inc(Result, Ord(IElm in Ens));
    End;
    C'est ce que tu ne voulais pas faire mais je pense que tu n'as pas le choix, désolé. Cela te pose vraiment un problème ?

    cdlt

    e-ric

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

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

  7. #7
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Citation Envoyé par e-ric
    La réponse donnée par Pascal est valable en .Net pas avec Delphi 7 (win 32).
    C'est pas l'impression que j'ai eu, cela a été testé sur Delphi 2005 et sur un projet Win32 et non .Net
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci, cela fonctionne parfaitement.

    La raison de ma question : NTaille est grand (au moins 100) mais les ensembles considérés ont au maximum une dizaine d'éléments. J'aurais voulu éviter une boucle de longueur NTaille comportant 10 fois plus de termes que la taille de l'ensemble à dénombrer.
    J'avais pensé à utiliser exclude pour chaque élément trouvé jusqu'à ce que l'ensemble soit vide (=[]) mais cela fait boucler jusqu'au rang du dernier élément (qui peut valoir NTaille)
    et cela rajoute une opération (exclude) + compteur et test =[] à chaque étape.

  9. #9
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    une question stupide
    pourqoi veux tu savoir le nombre des elements que tu as toi meme crée????
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    En raison du point 2) de ma question initiale
    2) (ne pas avoir à) suivre éléments par élément les opérations successives d'intersection et de réunion.
    j'effectue des simulations à l'aide de fonctions aléatoires et seul le nombre d'éléments de certains ensembles m'intéresse.

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 920
    Points
    3 920
    Par défaut
    Citation Envoyé par Pascal Jankowski
    C'est pas l'impression que j'ai eu, cela a été testé sur Delphi 2005 et sur un projet Win32 et non .Net
    C'est sans doute possible avec D2005, je n'ai pas fait le test car je n'ai pas ce compilo, je ne peux pas te contredire à ce sujet.

    Sous D2005, le compilo Win32 profite sans doute des extensions du langage sous .Net. Mais sous D7, pas de cela !

    cdlt

    e-ric

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

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

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 920
    Points
    3 920
    Par défaut
    Citation Envoyé par prog33
    En raison du point 2) de ma question initiale
    2) (ne pas avoir à) suivre éléments par élément les opérations successives d'intersection et de réunion.
    j'effectue des simulations à l'aide de fonctions aléatoires et seul le nombre d'éléments de certains ensembles m'intéresse.
    Ne peux-tu pas créer une classe TEnsemble permettant toutes ces opérations sans t'appuyer sur le type standard set of.

    Cela demande plus de travail mais est plus extensible. Tout dépend de la réutilisabilité d'une telle classe. N'oublions pas non plus que les ensembles sont limités en taille (256 éléments)

    PS: je viens de me rendre compte que j'ai oublié le type de ma fonction : integer, comme vous l'aurez tous corrigé.

    cdlt

    e-ric

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

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

  13. #13
    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
    Juste pour info
    Citation Envoyé par Pascal Jankowski
    C'est pas l'impression que j'ai eu, cela a été testé sur Delphi 2005 et sur un projet Win32 et non .Net
    Il s'agit des itérateurs disponible depuis Delphi 2005 Win32 et .NET.

  14. #14
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Merci Laurent pour cette précision, et désolé e-ric et prog33 pour ma réponse. J'aurais du la tester sur D5 (je n'ai pas D7)
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  15. #15
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par prog33
    ...
    const NTaille = un entier de 10 à 100;
    type TIntervalle = [1..NTaille];
    var UnEnsemble : set of TIntervalle;
    ...
    2) suivre éléments par élément les opérations successives d'intersection et de réunion.
    Citation Envoyé par prog33
    seul le nombre d'éléments de certains ensembles m'intéresse.
    soit je suis stupide soit ...; mais la tu déclare un ensemble a ntaille element et tu cherche le nombre des element de cette ensemble
    désoler si j'ai pas vraiment compri, mais tu peut me donnée un peut de votre temp et m'expliqué un peut plus???????
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  16. #16
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Citation Envoyé par edam
    soit je suis stupide soit ...; mais la tu déclare un ensemble a ntaille element et tu cherche le nombre des element de cette ensemble
    désoler si j'ai pas vraiment compri, mais tu peut me donnée un peut de votre temp et m'expliqué un peut plus???????

    Salut edam!

    Je crois comprendre sur quoi tu accroches...

    NTaille c'est la longueur du type TIntervalle. Ici, on cherche la taille de l'ensemble UnEnsemble qui n'est pas de type TIntervalle mais de type set of TIntervalle. Ça veut dire quoi ? En gros que UnEnsemble pourrait uniquement contenir les valeurs 3 et 57 et avoir une longueur de 2 pendant que NTaille est initialisé à 100 (donc que les valeurs possibles de TIntervalle soient des entiers entre 1 et 100, pour une longueur de 100).

    Je suis la discussion depuis le début. Moi aussi j'aurais aimé trouver une méthode toute faite
    -Slimjoe

  17. #17
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Slimjoe et edam

    Slimjoe a parfaitement compris le problème.


    e-ric
    Pour NTaille > 256, je pense que le mieux pour TEnsemble est un TBit avec
    soit un champ TrueBits pour un suivi permanent
    soit une procedure CountTrueBits pour un suivi occasionnel

    intersection de deux ensembles : opérateur booléen AND bit par bit
    réunion de deux ensembles: OR bit par bit
    element IN ensemble: Bit[element] = true

    Si j'ai bien compris la doc, un ensemble est de toute façon representé de manière interne par un bitmap similaire à un TBit

    Merci à tous pour vos réponses
    prog33

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 920
    Points
    3 920
    Par défaut
    J'avais complètement oublié cette classe TBit, j'ai dû m'en servir une fois il y a longtemps.

    cdlt

    e-ric

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

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

  19. #19
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par slimjoe
    Salut edam!

    Je crois comprendre sur quoi tu accroches...

    NTaille c'est la longueur du type TIntervalle. Ici, on cherche la taille de l'ensemble UnEnsemble qui n'est pas de type TIntervalle mais de type set of TIntervalle. Ça veut dire quoi ? En gros que UnEnsemble pourrait uniquement contenir les valeurs 3 et 57 et avoir une longueur de 2 pendant que NTaille est initialisé à 100 (donc que les valeurs possibles de TIntervalle soient des entiers entre 1 et 100, pour une longueur de 100).

    sa je le sais déjà, unensemble que tu déclare de type set of a suremnt a nombre connu d'elemnt quant tu le déclare et mem avant décrir un seul ligne de code,non??
    tu dis
    En gros que UnEnsemble pourrait uniquement contenir les valeurs 3 et 57 et avoir une longueur de 2 pendant
    sa veux dire que tu connais déjà la taille (2 ici) aavnt l'utilisation de cette ensemble;

    c'est pas la premiére fois que je vois sa sur ce forum, en casse la tete a ajoute des ligne de code pour cherché quelque chose ou trenstypé des variable que nous savont déjà leur type leur taille,
    je parle pas ici des variable crée dynamiquement, ni pour minimisé le code
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  20. #20
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Edam, regarde du côté des routines include et exclude dans l'aide de delphi et tu comprendra ce que l'on peut faire avec les ensembles.
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

Discussions similaires

  1. Comment obtenir le nombre de caractères d'un TMemo ?
    Par perrysoft dans le forum Composants VCL
    Réponses: 9
    Dernier message: 31/03/2016, 16h08
  2. [Vb.Net] Comment obtenir le nombre de ligne(s) d'un DataGrid ?
    Par dinbougre dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/12/2007, 12h25
  3. Réponses: 28
    Dernier message: 22/09/2005, 11h57
  4. Comment obtenir le nombre de jours entre deux timedatepicker
    Par bertrand_declerck dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/08/2005, 11h59
  5. Comment obtenir le nombre de documents en attente d'impression ?
    Par Cambon dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 25/03/2005, 09h17

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