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

C++Builder Discussion :

Tableau utilisé une énumération comme Indice


Sujet :

C++Builder

  1. #1
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 460
    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 460
    Points : 24 874
    Points
    24 874
    Par défaut Tableau utilisé une énumération comme Indice
    Voici ce que j'écris en Delphi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type
      MonEnum = (meUn, meDeux, meTrois);
     
    const
      MonTableau: array[MonEnum] of string = ('Un', 'Deux', 'Trois');
    var
      indice: MonEnum; 
    ...
      for indice := Low(indice) to High(indice) do
         ShowMessage(MonTableau[indice]);
    Voici ce que j'ai trouvé de plus approchant C++Builder XE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      enum MonEnum {meUn, meDeux, meTrois, MonEnumCount};
      String MonTableau[MonEnumCount] = {"Un", "Deux", "Trois"};
      for (MonEnum indice = meUn; indice < MonEnumCount; indice = indice + 1)
      {
        ShowMessage(MonTableau[indice]);
      }
    Je trouve cela assez nul en terme de maintenance, comment avoir proprement la taille d'une énumération (ou d'un tableau) ?

    pourquoi "indice++" ne fonctionne pas ?
    Erreur E2277 Lvalue nécessaire
    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

  2. #2
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Je ne sais pas si ca te sera utile, mais tu peux obtenir le nombre d'élément d'un tableau par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int count = sizeof( nomTab) / sizeof(nomTab[0]) ;
    Mais je ne comprend pas trop ce que tu souhaite faire, ni pourquoi avoir un type énuméré lié à un tableau?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      AnsiString MonTableau[] = {"Un", "Deux", "Trois"};
     
      int count = sizeof( MonTableau) / sizeof(MonTableau[0]) ;
      for( int i = 0; i < count; i++)
        ShowMessage( MonTableau[i] ) ;
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 460
    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 460
    Points : 24 874
    Points
    24 874
    Par défaut
    Merci, j'ai vu cette méthode du sizeof sur les forums Visual C++ !
    Mais c'est sur le tableau !

    En Delphi, les opérateurs Low et High permettent de récupérer la plus petite valeur d'un type énumérée et la plus grande ...

    Pour la déclaration d'un tableau avec indice enuméré, j'utilise souvent cette syntaxe quand je déclare plusieurs tableaux qui doivent être utilisés conjointement (parfois j'utilise un tableaux de struct mais c'est chiant à initialiser), le compilateur averti toute de suite un oubli, utile si c'est réparti d'une plusieurs unités

    en fait le code c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     enum CarriereOutils {coPelle, coPioche, coTNT, CoBarreAMine, coMasqueEtTuba, CarriereOutilsCount};
      const int OutilsDelaiMinutes[CarriereOutilsCount] = {15, 20, 25, 30, 35};
    C'est plus un exercice de style, j'essaye de revoir tout ce que je connais en Delphi en C++ !

    En fait, je m'inspire du code même des unités system.pas, classes.pas qui utilise massivement ce genre d'écriture.
    Je n'ai que le HPP, pas les CPP

    J'ai trouvé un exemple dans recerror.pas et recerror.cpp, et même dans ce code de la lib, il n'utilise pas la même structure de code !
    TReconcileAction dans DBClient

    Delphi 7
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      TReconcileAction = (raSkip, raAbort, raMerge, raCorrect, raCancel, raRefresh);
     
      ActionStr: array[TReconcileAction] of string = ('Ignorer', 'Abandon', 'Fusion',
        'Correct', 'Annuler', 'Rafraîchir');
    C++ XE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      enum TReconcileAction { raSkip, raAbort, raMerge, raCorrect, raCancel, raRefresh };
     
      char *ActionStr[] = {"Skip", "Abort", "Merge",
        "Correct", "Cancel", "Refresh"};
    Donc effectivement, en C++, si ce n'est pas possible proprement, je comprends que n'en voit pas l'utilité puisque la seule utilité est d'architecturer le code et que l'on compilateur détecte les anomalies, sans méthode propre, ce n'est forcément plus viable !

    j'utilise souvent une Enumération et un tableau de MetaClass lorsque j'ai besoin d'avoir des comportements prédéfinis et configurables, très courant dans les imports de fichier, le dialogue avec des robots, proche un Pattern Strategy !
    Lorsque l'énumération devient trop longue ou que cela va trop changer, j'utilise un RegisterClass qui est moins facile à détecter dans le code !

    Exemple
    Structure conditionnelle et repétitive
    Ouverture d'une TForm selon valeur d'un String
    Select Case et variable évaluée
    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
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonjour,
    type
    MonEnum = (meUn, meDeux, meTrois);

    const
    MonTableau: array[MonEnum] of string = ('Un', 'Deux', 'Trois');
    var
    indice: MonEnum;
    ...
    for indice := Low(indice) to High(indice) do
    ShowMessage(MonTableau[indice]);
    A mon sens une des possibilités de traduction serait la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     String MonTableau[MonEnumCount] = {"Un", "Deux", "Trois"};
      for (int i=0; i<MonEnumCount ; i++)
       {
    	ShowMessage(MonTableau[i]);
     
       }
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Points : 446
    Points
    446
    Par défaut
    Hello,

    Je vais répéter un peu ce qui a été dit mais ajouter une explication possible pour ton "indice++" qui ne marche pas.

    Le type MonEnum étant un énum, il peut être converti en un nombre mais n'en est pas vraiment un pour le compilateur et l'opérateur++ n'ayant pas été défini tu ne peut probablement pas l'utiliser sans convertir explicitement ton type.

    Moi j'aime bien utiliser une notation qui me fait penser à la STL et j'aurais utilisé (les meBEGIN et meEND sont purement personnelle, ça marchera très bien sans le meBEGIN et en remplaçant meEND par MonEnumCount)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    enum MonEnum {meBEGIN=0, 
                           meUn=0, 
                           meDeux, 
                           meTrois, 
                           meEND};
      String MonTableau[meEND] = {"Un", "Deux", "Trois"};
      for (size_t indice = (size_t)meBEGIN; indice != (size_t)meEND; ++indice)
      {
        ShowMessage(MonTableau[indice]);
      }

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 460
    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 460
    Points : 24 874
    Points
    24 874
    Par défaut
    Effectivement, prendre l'habitude de mettre un début et une fin, et je juste faire attention à les maintenir correctement (un petit commentaire)

    l'astuce de forcer la numérotation est astucieuse pour le meBegin

    Maintenant que je sais que ce n'est pas possible sans bidouille, j'utiliserais surement nettement pas cette technique en C++, ellle y perd tout l'intérêt que je lui trouvais en Delphi
    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

Discussions similaires

  1. [AC-2003] Gestion de 8 zones d'une table comme un tableau (Dim() en VBA)
    Par Godzestla dans le forum Modélisation
    Réponses: 8
    Dernier message: 06/12/2009, 18h22
  2. insérer une figure comme un tableau
    Par moon61 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 03/04/2009, 19h20
  3. Indicer un tableau avec une chaine de caractères
    Par petdelascar dans le forum C
    Réponses: 10
    Dernier message: 08/11/2007, 14h55
  4. utilisé une chaine comme un nom de variable sous delphi ?
    Par hatem_info dans le forum Langage
    Réponses: 3
    Dernier message: 11/10/2005, 16h22
  5. [Utilier une table comme un tampon]
    Par Straahd dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 01/09/2005, 20h27

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