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

  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 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
    ? là je vois pas ...
    T'es sur que c'est la bonne ligne?


    et qu'est ce qe tu entends par struct person est sous type de void???
    Non, "struct person *" est un sous type de "void *", c'est à dire qu'on peut mettre un "void *" dans un "struct person *" sans faire de transtypage.
    A mon avis dans la spec du C, doit y avoir un autre terme pour qualifier cette hierarchie de types, j'ai dit ça un peu au pif.

  8. #8
    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??

  9. #9
    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.

  10. #10
    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 )

  11. #11
    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.

  12. #12
    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
    Citation Envoyé par Emmanuel Delahaye
    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).
    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.
    oui effectivement, tu as raison, mea culpa; j'ai trop pris l'habitude de compiler le C et le C++ avec le meme compilateur C++
    Mon commentaire etait surtout pour lui démontrer l'utilité d'un enum et non le perdre dans les subtilités entre un compilo C et un compilo C++.
    Le fait qu'il veuille utiliser un enum alors qu'il débute est qd mm encourageant, parce que moi quand j'ai débuté.....

  13. #13
    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
    j'ai trop pris l'habitude de compiler le C et le C++ avec le meme compilateur C++

  14. #14
    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
    Citation Envoyé par Emmanuel Delahaye
    j'avais dit "mea culpa"

  15. #15
    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
    j'avais dit "mea culpa"
    Rien à dire sur le meat qui ne coule pas (je ne suis pas plombier). Par contre, utiliser un compilateur C pour compiler du C++, c'est gerbou...

  16. #16
    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
    Citation Envoyé par Emmanuel Delahaye
    Rien à dire sur le meat qui ne coule pas (je ne suis pas plombier). Par contre, utiliser un compilateur C pour compiler du C++, c'est gerbou...
    je ne dit pas le contraire, mais bon dans ma boite, je ne peux helas pas changer cet aspect là des choses... du coup, je prends des mauvaises habitudes et je me fais ensuite charrier sur les forums
    mais bon on s'ecarte un peu du sujet du post

  17. #17
    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

  18. #18
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Le warning t'indique qu'il est préférable de pas utilisé scanf. Il est préférable d'utiliser la fonction fgets.

    Tu déclares et utilises la fonction angabe(struct client *var) mais le linker ne trouve pas cette fonction. Probablement tu as oublié de l'écrire.

  19. #19
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Par défaut
    je vais ecrire la fonction tout de suite et voir, mais dis pouquoi je devrais pas utiliser scanf exactement?? et au lieu de fgets pour une entrée , gets ne serait pas preferableß??

  20. #20
    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
    Citation Envoyé par chrysmac2003
    je vais ecrire la fonction tout de suite et voir, mais dis pouquoi je devrais pas utiliser scanf exactement?? et au lieu de fgets pour une entrée , gets ne serait pas preferableß??
    Pourquoi est-il déconseillé d'utiliser scanf ?

    gets ne serait pas preferableß?
    Oh que non! Tu ne spécifies pas la taille de saisie et il y a donc risque de débordements...Cette fonction ne controle du tout cela!

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