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 :

travailler avec un type enuméré


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Par défaut travailler avec un type enuméré
    salut a tous
    il y'a quelque chose que je ne comprend pas; pourqoi lorsque je créé un type de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    enum day {monday,tuesday,wednesday,thursday,friday,saturday,sunday};
    je ne peus pas ensuite comparer directement une variáble string a une de ces valeurs ? j#ai lö'impression qu'on ne peut travailler qu#avec les valeurs numeriques que prennes ces jours dans ce type enuméré la! par exemple si je tape
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s \n",(enum)(1));
    je me serai attendu a ce que ca m'affiche directement tuesday a l'ecran, mais ce nest que lorsque je remplace %s par %d que ca m'affiche 1, j'ai finalement ete obligé de creer plutot un tableau constant de ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char day1[7][10]={"monday","tuesday","wednesday","thursday","friday","saturday","sunday"};
    et entrer ensuite ceci pour afficher un resultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s \n",day1[1]);
    mais cela veut donc dire que ce type enuméré ne me sert pas a grand chose! ou je l'emploi mal??

  2. #2
    Invité
    Invité(e)
    Par défaut
    une enum est en fait un int...
    donc ton type "day" est traité comme un int particulier, qui peut prendre un e valeur comprise entre 0 et 6.

  3. #3
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Pour la route, un petit lien concernant l'utilisation de enum:
    The enum statement

  4. #4
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Par défaut
    ok, mais je viens d'avoir une erreur que je comprend s pas la, elle se referre a la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    first=(struct person*) malloc (sizeof(struct person));
    et se presente ainsi
    Error 1 error C2040: 'first' : 'int' differs in levels of indirection from 'person *' c:\Dokumente und Einstellungen\Besitzer\Eigene Dateien\Visual Studio 2005\Projects\SOL_GDI_Praktikum\GDI_Praktikum\verketteteliste.c 27
    y#a t il une erreur au niveau de mon allocation??
    si cest necessaire voici la definition de la structure :
    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
    struct date
    {
    	unsigned int d;
    	char m[10];
    	unsigned long int y;
    };
    struct person
    {
    	unsigned int num;
    	char name[60];
    	struct date birth;
    	enum job j;
    	struct person *next;
    	struct person *previous;
    };
    enum

  5. #5
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Quel est le type de "first"?
    Au fait, le cast avant le malloc ne sert à rien
    "struct person*" est un sous type de "void *"

    (lol, ça fait bizarre, windows en allemand )

  6. #6
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Par défaut
    pour first :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct person *first,*last,*var1,*var2;
    et qu'est ce qe tu entends par struct person est sous type de void???

  7. #7
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Par défaut
    Citation Envoyé par homeostasie
    Pour la route, un petit lien concernant l'utilisation de enum:
    The enum statement
    d'apres ce que je lis sur ce lien la, je devrais pouvoir attribuer a chaque variable du type enuméré un string! ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    enum escapes { BELL   = "mardi", BACKSPACE = "mercredi", HTAB = '\t',
                           RETURN = '\r', NEWLINE   = '\n', VTAB = '\v' };
    ou bien??

  8. #8
    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 chrysmac2003
    d'apres ce que je lis sur ce lien la, je devrais pouvoir attribuer a chaque variable du type enuméré un string! ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    enum escapes { BELL   = "mardi", BACKSPACE = "mercredi", HTAB = '\t',
                           RETURN = '\r', NEWLINE   = '\n', VTAB = '\v' };
    ou bien??
    Non.

    Le langage n'offre pas de facilité pour associer une chaine et un enum.

    Mais ceci est correct :
    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
     
    enum controls 
    { 
       BELL = '\a', 
       BACKSPACE = '\b', 
       HTAB = '\t',
       CARRIAGE_RETURN = '\r', 
       NEWLINE  = '\n', 
     
    /* pas sur que ce soit standard... */
       VTAB = '\v',  
     
    /* c'est lui qui se prend l'expression sans ','. Ne sert a rien d'autre */
       control_dummy 
    };
    Par contre, des macros astucieuses permettent d'automatiser la production de ce code ci :

    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
     
    enum controls 
    { 
       BELL = '\a', 
       BACKSPACE = '\b', 
       HTAB = '\t',
       CARRIAGE_RETURN = '\r', 
       NEWLINE  = '\n', 
       VTAB = '\v',  
       control_dummy 
    };
     
    static struct controls const *a_controls[] = 
    {
       BELL, "BELL", 
       BACKSPACE, "BACKSPACE", 
       HTAB, "HTAB",
       CARRIAGE_RETURN, "CARRIAGE_RETURN", 
       NEWLINE, "NEWLINE", 
       VTAB, "VTAB",  
    };
    ce qui permet, avec la fonction qui va bien, de retourner une chaine en fonction de la valeur.

  9. #9
    Membre éclairé Avatar de telliam
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Par défaut
    je vais essayer de résumé, un enum ne sert qu'a créer une liste de valeurs numeriques.
    Avec le code suivant tu auras a=0,b=1,c=2.

    Le compilateur,par défaut, affecte la valeur 0 au premier champ et incremente la valeur pour le champ suivante.
    Mais tu peux aussi tres bien forcer la valeur du premier champ ( par exemple commencer à 10) : Dans ce cas là,tu auras a=10,b=11,c=12

    Tu peux également forcer la valeur de tous tes champs et même avoir des champs qui auront la même valeur. Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum test {first=1,one=first,two=2,three,four,five,last=five}
    Son utilisation :

    cela sert, par exemple, à faire un typage fort des paramètres d'une fonction.
    Si tu déclares comme paramètre de fonction une variable de type enum test, tu forceras les utilisateurs à utiliser que des valeurs supportés ( sauf si bien sur il caste le paramètre, mais bon dans ce cas là c'est pas un codeur c'est un terroriste )

  10. #10
    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 telliam
    cela sert, par exemple, à faire un typage fort des paramètres d'une fonction.
    Arf ! y'a pas de typage fort en C, ça se saurait ! Un enum a un rôle purement documentaire (mais c'est déjà très important).
    Si tu déclares comme paramètre de fonction une variable de type enum test, tu forceras les utilisateurs à utiliser que des valeurs supportés
    Malheureusement, en C le contrôle ne se fait que sur les pointeurs, et encore, rien n'obige le compilateur à émettre un warning. C'est plus une facilité offerte qu'une contraite d'une langage.

    Par contre en C++, oui, il y a typage fort.

  11. #11
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Par défaut
    Citation Envoyé par telliam
    mais bon dans ce cas là c'est pas un codeur c'est un terroriste )

    bon merci pour l#aide pour enum, et en ce qui concerne l'erreur, j'ai retapé le programme, mon code ressmble a ceci(pour l'instant) :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    enum todo {add='a',remov='r',move='m',end='e'};
    char days[7][10]={"monday","tuesday","wednesday","thursday","friday","saturday","sunday"};
    char months[12][12]={"january","february","march","april","mai","june","july","august","september","october","november","december" };
     
    struct date 
    {
    	char d[10],m[11];
    	unsigned y;
    };
    struct client
    {
    	int num;
    	char name[50],street[60];
    	struct date limit;
    	struct client *prev,*next;
     
    };
    void angabe(struct client *var);
    int main (void)
    {
    	int i,j,k;
    	enum todo test;
    	char str1,str2;
    	struct client *first,*last,*var1,*var2;
        first=malloc( sizeof(struct client) );
     
    	first->num=0;
    	do
    	{
    		printf("nb: a=add/r=remove/m=move/e=end\n");
    		printf("what do you want to do? : ");
    		scanf("%c",&test);
     
    		switch (test)
    		{
    		case (int)'a': 
    			{
    				if ( first->num==0 )
    				{
    					var2=var1;
    					first=last;
    					first=var1;
    				}
    				else
    				{
    					var2=var1;
    				}
    				var1=malloc( sizeof(struct client) );
    				last=var1;
    				last->prev=var2;
    				var2->next=last;
    				last->num=last->prev->num+1;
    				angabe(var1);
    			};break;
    		};
    	} while (test!='e');
    }
    et je recois toujours le warning suivant :
    Warning 1 warning C4996: 'scanf' was declared deprecated c:\Dokumente und Einstellungen\Besitzer\Eigene Dateien\Visual Studio 2005\Projects\SOL_GDI_Praktikum\GDI_Praktikum\verketteteliste01.c 35
    tout comme les erreurs suivant
    1)Error 2 error LNK2019: unresolved external symbol _angabe referenced in function _main verketteteliste01.obj
    2)Error 3 fatal error LNK1120: 1 unresolved externals C:\Dokumente und Einstellungen\Besitzer\Eigene Dateien\Visual Studio 2005\Projects\SOL_GDI_Praktikum\Debug\GDI_Praktikum.exe
    et pourtant je ne vois pas encore vraiment le trou.
    merci encore

Discussions similaires

  1. Utiliser un type enum(jdk5) avec Axis
    Par enzoenzo dans le forum Services Web
    Réponses: 6
    Dernier message: 10/02/2010, 10h48
  2. Comment le type enum avec Hibernate
    Par 0coco0 dans le forum Langage
    Réponses: 1
    Dernier message: 27/08/2008, 13h54
  3. Problème avec type enum
    Par oranoutan dans le forum Débuter
    Réponses: 4
    Dernier message: 19/05/2007, 13h47
  4. Réponses: 5
    Dernier message: 10/03/2007, 21h45
  5. [VB.NET] Variable de type enum avec du string
    Par Mouse dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/01/2005, 18h22

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