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 Discussion :

questions langage C


Sujet :

C

  1. #21
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    L'idee est d'associer des messages a des identificateurs internes automatiquement. Ca peut servir a traiter des erreurs, des messages d'information, ... Il est tres simple d'ajouter un message, sans avoir a penser a ajouter un identificateur et a augmenter le nombre maximum d'identificateurs.

  2. #22
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par e_gaillard37 Voir le message
    Je sais pas ...
    Donnez un exemple
    Ou vous utilisez cette merveille
    http://emmanuel-delahaye.developpez.com/clib.htm
    http://emmanuel-delahaye.developpez.com/item_list.htm

  3. #23
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Par défaut ...j'ai regarde l'expemle
    J'ai lu un des exemples cités

    enum permet en fait. de remplacer une serie de chiffre
    par des constantes symboliques en affectant une valeur a cette serie de constante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum fruits { BANANE, ORANGE, POMME, FRAISE, KIWI };
    donc par defaut
    BANANE vaut 0
    ORANGE vaut 1
    ...
    Vous me dites avec l'enrichissement d'un fichier externe on arrive a definir en fait a remplacer BANANE par "banane".
    Tres bien ... Pour une seule colonne ... la designation ...
    Cela ne presente pas d'interet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define BANANE "banane"
    #define ORANGE "orange"
    ...
    a le meme effet

    Il est clair qu'a partir de 2 colonnes c'est bien.
    Mais un peu hardu non ?


    Utilison des define
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define BANANE "banane","100 grammes"
    #define ORANGE "orange","25 grammes"
    ... structure de fichier en colonne ... Comme l'autre

    La methode citee dans l'exemple permet de faire un truc du style
    "banane", "100 grammes"... Ce que peut faire aussi le define je viens de le verifier

    Mais "100 grammes","banane" ... la le define semble etre out
    ainsi que pour ignorer une colonne
    Mais il en a sous la semelle


    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
    #define BANANE "banane","100 grammes"
    #define ORANGE "orange","25 grammes"
    ...  // le fichier inclu contenant les define
     
    #define solo_poids(fruit,poids) poids
    // la macro ci dessus permet sans doute de ne voir que certaines 
    // colonnes et ds un ordre désire
     
    void poids_du_fruit(char * fruit,char * ch) // fonction contenant structure complete
    {
       char ch1[100];
       strcpy(ch1,solo_poids(fruit,ch));
       ....
    }
     
    int main( int argc, char ** argv )
    {
       poids_du_fruit(BANANE);  // on ne passe que la constante symbolique
       poids_du_fruit(ORANGE);  // on peut donc definir des fonction quelconques 
    }
    Ca compile ...

    Pas besoins de definir enum ... on met nos define ds le fichier inclus
    La victoire de enum... sur define est pas ecrasante pour l'exemple cite
    ... Pas eu besoin d'enumerer BANANE,ORANGE....

    Quelle est la solution la plus elegante ?
    La solution enum a t elle un avantage ?

    Par contre , linitialisation à 0,1,2... ca c'est valable c sur.. pour la clarté d'un programme, c'est une evidence. On a juste a definir le nom dans le enum.

  4. #24
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par e_gaillard37 Voir le message
    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
    21
     
    #define BANANE "banane","100 grammes"
    #define ORANGE "orange","25 grammes"
    ...  // le fichier inclu contenant les define
     
    #define solo_poids(fruit,poids) poids
    // la macro ci dessus permet sans doute de ne voir que certaines 
    // colonnes et ds un ordre désire
     
    void poids_du_fruit(char * fruit,char * ch) // fonction contenant structure complete
    {
       char ch1[100];
       strcpy(ch1,solo_poids(fruit,ch));
       ....
    }
     
    int main( int argc, char ** argv )
    {
       poids_du_fruit(BANANE);  // on ne passe que la constante symbolique
       poids_du_fruit(ORANGE);  // on peut donc definir des fonction quelconques 
    }
    Outre le fait qu'appeller une fonction a deux parametres avec un seul parametre n'est pas a mon sens tres naturel ni tres lisible, une telle methode n'est applicable que pour l'appel de fonction.
    En effet, tu ne peux pas, par exemple, affecter l'identifiant a une variable (quel en serait le type ? XXXX = "banane","100 grammes" ne sera pas correct), tu ne peux pas utiliser ces identifiant dans un switch() ... case, etc.
    Bref cette methode qui ressemble plus a du bricolage qu'autre chose ne peut pas fournir les memes avantage qu'une construction a base de enum.

  5. #25
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Par défaut
    OK pour les switch ... j'ai ete clair la dessus.
    Mais personne n'a ete capable de me confirmer si le case s'applique a chaque constante de l'ensemble ecrites une par une ...
    en ecrivant
    case bleu, blanc ,rouge
    ou si on peut aussi l'appliquer a l'ensemble
    case couleur_du_drapeau_francais

    Le second cas serait un truc valable


    mais bon ... si le truc cite plus haut existe pas
    Ca definit des ensembles avec de valeurs par defaut croissante ... c'est extra
    Si dans l'enum on met a la fin fin_de_tableau

    Partout on peut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i=0;i<fin_de_tableau;i++)
      {
      ... on sait qu'on teste notre enumeration sans se poser la question de savoir 
      ... si on les a initialisé au contraire d'une serie de define
      }

    Pour le bricolage ...
    Tes propos n'engagent que toi

    Va voir l'exemple ... Tu me diras si en 5 mn t'as compris ... Il n'est pas impossible que ce soit bien compliqué. Et peut être qu'ils utilisent ... Les memes artifices pour recuperer une colonne.

    Concernant les fichier inclus et leur traitement
    Et le but reste le meme ... faire un truc du style erreur(CONSTANTE_SYMBOLIQUE)


    Si, il y a une incoherence dans le fichier... Le programme ne compilera pas
    De la meme facon ... Pour l'autre méthode

    Mais bon... Il est pas impossible desormais que je sache ce qu'est enum.

    Merci les gars ... et j'espere pas avoir embete mon monde

  6. #26
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Mais personne n'a ete capable de me confirmer si le case s'applique a chaque constante de l'ensemble ecrites une par une ...
    en ecrivant
    case bleu, blanc ,rouge
    ou si on peut aussi l'appliquer a l'ensemble
    case couleur_du_drapeau_francais
    Non ce n'est pas possible.

    Le second cas serait un truc valable
    Bof! Le but d'enum est de faire des énumérations finies sur lesquelles on puisse faire des discriminations. Je ne vois pas l'intérêt de traiter les éléments d'une énumération de la même façon. Couramment, tu utilises switch sur un seul type d'énumération.

    mais bon ... si le truc cite plus haut existe pas
    Ca definit des ensembles avec de valeurs par defaut croissante ... c'est extra
    Si dans l'enum on met a la fin fin_de_tableau

    Partout on peut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i=0;i<fin_de_tableau;i++)
    {
    ... on sait qu'on teste notre enumeration sans se poser la question de savoir
    ... si on les a initialisé au contraire d'une serie de define
    }
    Oui, ça peut être une utilisation intéressante des enums mais pas forcément classique. Cette façon de faire me fait penser à l'indexation des tableaux en ADA.

    Pour le bricolage ...
    Tes propos n'engagent que toi

    Va voir l'exemple ... Tu me diras si en 5 mn t'as compris ... Il n'est pas impossible que ce soit bien compliqué. Et peut être qu'ils utilisent ... Les memes artifices pour recuperer une colonne.
    C'était du bricolage. Tu dois écrire quelque chose de lisible et compréhensible et non pas user d'astuces obscures.

    Concernant les fichier inclus et leur traitement
    Et le but reste le meme ... faire un truc du style erreur(CONSTANTE_SYMBOLIQUE)


    Si, il y a une incoherence dans le fichier... Le programme ne compilera pas
    De la meme facon ... Pour l'autre méthode

    Mais bon... Il est pas impossible desormais que je sache ce qu'est enum.

    Merci les gars ... et j'espere pas avoir embete mon monde
    Complètement si. Penche toi sur un livre de C avant d'affabuler.
    Merci aussi d'utiliser les balises CODE. Je ne sais pas combien de fois on te l'aura dit. C'est aussi pour gagner en lisibilité.

  7. #27
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par e_gaillard37 Voir le message
    Va voir l'exemple ... Tu me diras si en 5 mn t'as compris ... Il n'est pas impossible que ce soit bien compliqué. Et peut être qu'ils utilisent ... Les memes artifices pour recuperer une colonne.
    Quel exemple ?

    Le tien ? Oui ca se comprends car il est limite au strict minimum permettant de presenter le principe.
    Dans un source complet, j'en suis moins certain (surtout a cause du nombre de parametres reels diferent du nombre de parametres apparents).

    Celui d'Emmanuel ou de DaZumba ? Oui ca se comprends assez rapidement (enfin bien sur si on conait un minimum les macros et le fonctionnement de # et ##, mais bon ca reste quand meme assez basique).

    Quels artifices utilises pour recuperer une colonne te choque ? Definir une macro ? Mais ce n'est pas ca qui me gene dans ton principe.

    Citation Envoyé par e_gaillard37 Voir le message
    Concernant les fichier inclus et leur traitement
    Et le but reste le meme ... faire un truc du style erreur(CONSTANTE_SYMBOLIQUE)
    Non ce n'est pas le but, c'est un des buts. On peut l'utiliser effectivement pour la gestion d'erreur, mais ca ne se limite pas a ca.

    Citation Envoyé par e_gaillard37 Voir le message
    Si, il y a une incoherence dans le fichier... Le programme ne compilera pas
    De la meme facon ... Pour l'autre méthode
    Ce qui est plutot une bonne chose. Je prefere largement un programme qui ne compile pas du tout a un programme qui compile et qui semble marcher jusqu'au jour ou ...

  8. #28
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par gl Voir le message
    Outre le fait qu'appeller une fonction a deux parametres avec un seul parametre n'est pas a mon sens tres naturel ni tres lisible,
    Surtout, ca ne devrait pas passer la compilation.

  9. #29
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Surtout, ca ne devrait pas passer la compilation.
    Son exemple qui utilise un unique define pour simuler les deux parametres de la fonctions compile au moins sous gcc.
    Pour la portabilite d'une telle methode, j'ai un doute mais n'ayant jamais eu a creuser ce cas je reserve mon avis.

  10. #30
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par e_gaillard37 Voir le message
    (snip)


    Pour le bricolage ...
    Tes propos n'engagent que toi

    Va voir l'exemple ... Tu me diras si en 5 mn t'as compris ... Il n'est pas impossible que ce soit bien compliqué. Et peut être qu'ils utilisent ... Les memes artifices pour recuperer une colonne.

    Concernant les fichier inclus et leur traitement
    Et le but reste le meme ... faire un truc du style erreur(CONSTANTE_SYMBOLIQUE)


    Si, il y a une incoherence dans le fichier... Le programme ne compilera pas
    De la meme facon ... Pour l'autre méthode

    Mais bon... Il est pas impossible desormais que je sache ce qu'est enum.

    Merci les gars ... et j'espere pas avoir embete mon monde
    Il est vrai que, si on regarde de manière purement superficielle, l'utilisation d'un enum revient *à peu près* à l'utilisation de plusieurs #define.

    Mais c'est tirer des conclusions un peu hâtives.

    Un #define est une instruction préprocesseur.

    Le résultat est que quand tu lance ta compilation, le préprocesseur va parcourir le fichier d'en-tête, voir que tu définit BANANE, FRAISE, FRAMBOISE et tous les autres à une valeur "unique", et, chaque fois qu'il rencontrera l'un de ces termes, il ne se posera pas la question: il remplacera le terme par la valeur que tu lui a donnée... Sans s'inquiéter de savoir s'il y a la moindre logique, à un moment donné, de remplacer le terme par la valeur.

    Cela signifie que, si tu a fournis une valeur numérique entière pour tes #define tu n'aura pas de vérification quant au fait de savoir si le remplacement de BANANE par l'entier fournis est "cohérente" avec le reste du code qui l'entoure...

    Par contre, les valeurs énumérées sont d'office et obligatoirement de type entier.

    Le résultat en est que, si, pour une raison qui ne tient qu'à toi, en cours de développement, tu vient à décider de remplacer la valeur de ton #define BANANE par autre chose (une chaîne de caractères ou un réel) tu auras (ou si tu préfère, tu peux avoir) l'impression de pouvoir le faire "sans risque"... mais la prochaine compilation te sortira des erreurs en pagaille.

    Par contre, dans le cadre d'un enum, non seulement les valeurs énumérées sont groupées, avec tous les avantage que cela peut te conférer, mais en plus, tu sais que si tu veux changer la valeur d'un des éléments, la nouvelle valeur ne pourra en tout cas être que... un nouvel entier.

    PS Pense à utiliser la balise [ CODE ] [ /CODE ] (sans les espaces) pour entourer les exemples de code dans tes message (le bout "#" au dessus du formulaire fait pareil), plein d'avantages pour tout le monde sont à la clé
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #31
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Personnellement, et pour ajouter mon grain de sel, j'utilise beaucoup les enum, et surtout pour faire mes propres types et expliciter mon code.

    Par exemple, un jeu de 32 cartes, voyons les enum qu'on peut définir :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    // Pour les valeurs de cartes :
    typedef enum PSYValue_tag
    {
        Sept = 0,
        Huit,
        Neuf,
        Dix,
        Valet,
        Dame,
        Roi,
        As
    } PSYValue;
     
    // Pour les couleurs des cartes :
    typedef enum PSYSuit_tag
    {
        Pic = 1,
        Coeur,
        Carreau,
        Trefle
    } PSYSuit;
     
    // Pour définir une carte :
    typedef struct PSYCard_tag
    {
        PSYSuit suit:4;
        PSYValue value:4;
    } PSYCard;
    Mes champs de bits ne sont ps nécessaire mais c'est pour limiter la taille, car un enum prenant par défaut 4 octets, pour 4 ou 8 valeurs c'est beaucoup je trouve...

    Bon continuons nos investigations. Par exemple, je vais définir un tableau de chaînes de caractères pour contenir les noms de mes variables :

    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
    static const char * const CardsName[] =
    {
        "Sept",
        "Huit",
        "Neuf",
        "Dix",
        "Valet",
        "Dame",
        "Roi",
        "As"
    };
     
    static const char * const CardsSuit[] =
    {
        "None",
        "Pic",
        "Coeur",
        "Carreau",
        "Trefle"
    };
    Et maintenant... Comment affiche-je le nom d'une carte ? Imaginons que nous avons une carte prédéfinie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Quelque part dans le code :
    PSYCard maCarte = {Pic, Valet}; // par exemple
     
    // plus loin pour afficher :
     
    printf("Ma carte : %s de %s.\n", CardsName[maCarte.value], CardsSuit[maCarte.suit])
    En console, nous verrons donc affiché :
    Ma carte : Valet de Pic.

    Personnellement, je trouve ce système génial... Mais ça n'engage que moi...
    Ah on peut aussi faire un switch par 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
    switch(premiereCartePosee.suit)
    {
        case Pic :
            printf("Pic demandé !\n");
            break;
        case Coeur :
            printf("Coeur demandé !\n");
            break;
        case Carreau :
            printf("Carreau demandé !\n");
            break;
        case Trefle :
            printf("Trefle demandé !\n");
            break;
        default :
            printf("ERREUR !\n");
            break;
    }
    Bien sûr, ici ce switch est inutile puisque les tableaux de valeurs peuvent nous faciliter l'écriture de la phrase. Cependant, on peut déjà entrevoir les possibilités que nous offre le enum.

    Donc, l'enum crée un nouveau type d'entier, et peut donc être utilisé partout où les entiers sont utilisés. C'est-à-dire qu'on peut remplacer un "int" ou "unsigned int" ou "short", etc. par enum monEnum et remplacé la valeur par l'une des valeurs définies dans l'enum...

  12. #32
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Par défaut enum ou define ?
    Merci, pour avoir expose vos divers points de vue.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. questions langage C
    Par space_56 dans le forum Autres éditeurs
    Réponses: 11
    Dernier message: 20/12/2007, 00h12
  2. question langage C
    Par claire_cartier dans le forum C
    Réponses: 7
    Dernier message: 05/11/2007, 11h56
  3. question langage C
    Par space_56 dans le forum C
    Réponses: 12
    Dernier message: 02/11/2007, 12h45
  4. [QUESTION] Langages à éviter ?
    Par Shadowritter dans le forum Langages de programmation
    Réponses: 28
    Dernier message: 12/01/2005, 10h34
  5. [langage] pb de question reponse
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 29/11/2002, 11h59

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