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 :

Problème de compréhension des ensembles


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 33
    Points : 28
    Points
    28
    Par défaut Problème de compréhension des ensembles
    D'après ce que j'ai compris de l'aide un ensemble accepte jusqu'à 256 valeurs et chacune de ces valeurs doit être comprise entre 0 et 255.

    Ce qui me laisse penser qu'avec le code suivant chaque variable de ce type peut accepter jusqu'à 256 valeurs et que chaque valeur(rang) est limité à 0,1,2 ou 3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TEnsembleEntiers = set of 0..3;
    Mais il accepte n'importe quel valeur entre 0 et 255 !
    De plus quand je fais le test d'appartenance avec in pour savoir si une valeur appartient à l'ensemble il me dit que 14 et 78 appartiennent à l'ensemble alors que 3 ou 8 n'y appartiennent pas !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.btnEnsembleClick(Sender: TObject);
    type
      TEnsembleEntiers = set of 0..3;
    var
      ensEntier : TEnsembleEntiers;
    begin
      ensEntier:=[1, 3, 8 ,15, 78 ];
     
      if 8 in ensEntier then
        showmessage('Appartient à l''ensemble !')
      else
        ShowMessage('En dehors de l''ensemble');
    end;
    Au secours !..

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Je viens d'essayer et je n'obtiens pas le même résultat. Dans ton ensemble, 3 retourne bien True et 8,15 et 78 retournent False ce qui est normal.

    L'aide de Delphi dit :
    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. Toute construction de la forme :

    set of typeBase

    où typeBase est un type scalaire approprié, identifie un type ensemble.
    Le type de base étant les entiers de 0 à 3, seuls les éléments 0 à 3 sont conservés. Ainsi ensEntier:=[1, 3, 8 ,15, 78 ] et ensEntier:=[1, 3] sont identiques.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Nono40
    Le type de base étant les entiers de 0 à 3, seuls les éléments 0 à 3 sont conservés. Ainsi ensEntier:=[1, 3, 8 ,15, 78 ] et ensEntier:=[1, 3] sont identiques.
    Merci pour cette explication, j'ai réessayé avec la procédure suivante et j'obtiens bien ce que tu me dis
    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
    procedure TForm1.button2Click(Sender: TObject);
    const
      tabEns : array[0..4] of integer = (1, 3, 8 ,15, 78);
    var
      ensEntier :set of 0..3;
      i: integer;
    begin
      ensEntier:=[1, 3, 8 ,15, 78 ];
     
      for i := 0 to high(tabEns) do begin
        if tabEns[i] in ensEntier then
          showmessage(IntToStr(tabEns[i])+ ': True')
        else
          showmessage(IntToStr(tabEns[i]) + ': False')
      end;
    end;
    Par contre avec ce code là, la valeur 78 me retourne 'True'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ensEntier :set of 0..3;
    begin
      ensEntier:=[1, 3, 8 ,15, 78 ];
      if 78 in ensEntier then
        showmessage('True')
      else
        ShowMessage('False');
    end;
    Est-ce normal ? !!

  4. #4
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Citation Envoyé par Cornell
    Par contre avec ce code là, la valeur 78 me retourne 'True'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ensEntier :set of 0..3;
    begin
      ensEntier:=[1, 3, 8 ,15, 78 ];
      if 78 in ensEntier then
        showmessage('True')
      else
        ShowMessage('False');
    end;
    Est-ce normal ? !!
    Bizarre, sur mon PC j'ai bien le message False... ( WinME D6Ent )

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    A mon avis, ca depend de l'optimisation, parce que les valeurs hors normes ne sont pas traitées. Tu dois t'assurer que tu utilises bien des valeurs qui appartiennent à ton ensemble, sinon il peut se passer vraiment n'importe quoi (la preuve apparemment) !

    Mic006

  6. #6
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Oui effectivement, après essais le résultat dépend de l'optimisation

    Il faut donc suivre le consiel de Mic006 et ne pas utiliser d'éléments n'appartenant pas au type de base.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    Merci pour ces infos !

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

Discussions similaires

  1. Problème de compréhension des Iterator
    Par ToTo13 dans le forum C++
    Réponses: 5
    Dernier message: 31/03/2010, 10h46
  2. Réponses: 6
    Dernier message: 01/03/2009, 13h48
  3. Problème de compréhension des CSocket
    Par olator dans le forum MFC
    Réponses: 4
    Dernier message: 05/11/2008, 10h52
  4. Réponses: 3
    Dernier message: 16/06/2008, 18h15
  5. Réponses: 2
    Dernier message: 14/12/2007, 02h47

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