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 :

Problème pointeur de structure


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Problème pointeur de structure
    Salut à tous,

    j'ai commencé à lire le chapitre des pointeurs et j'ai un petit souci avec les pointeurs de structures :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
     
    typedef struct date
    	{
    		int numj;
    		char nomm[21];
    		int an;
    	};
     
    void affiche(date *p);
    void main()
    {
     
    	struct date d;
    	printf("jour : ");
    	scanf("%d",&d.numj);
    	printf("mois : ");
    	gets(d.nomm);
    	printf("An : ");
    	scanf("%d",&d.an);
    	affiche(&d);
     
     
    	}
    	void affiche(date *p)
    	{
    		printf("%d %s %d",p->numj,p->nomm,p->an);
    	}
    les erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    error C2143: erreur de syntaxe*: absence de '{' avant '*'
     error C2059: erreur de syntaxe*: ')'
      warning C4013: 'affiche' non défini(e)*; extern retournant int pris par défaut
    error C2143: erreur de syntaxe*: absence de ')' avant '*'
    error C2143: erreur de syntaxe*: absence de '{' avant '*'
    error C2059: erreur de syntaxe*: ')'
    error C2054: '(' attendu après 'p'
    ========== Génération*: 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
    Aidez moi svp

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 785
    Points
    23 785
    Par défaut
    Bonjour,

    Réponse courte : retire le mot-clé typedef et recompile ton programme.

    Réponse plus détaillée : typedef sert à créer un alias sur un nom de type, justement pour s'épargner struct. C'est pratique mais pas indispensable et c'est une bonne chose de voir les choses dans l'ordre. Ce qui cause problème ici, c'est que tu n'as pas spécifié le nom de l'alias en question.

  3. #3
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonsoir,

    Ton programme souffre de plusieurs problèmes, bien que certains n'empêcheront sûrement pas la compilation.

    Problèmes syntaxiques

    Le premier vient de la déclaration de ta structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct date
    {
      int numj;
      char nomm[21];
      int an;
    };
    La syntaxe de typedef est la suivante :

    Citation Envoyé par C11 (n1570), § 6.7.8 Type definitions
    Ce que tu essayes de faire ici n'est donc pas conforme à la grammaire du mot-clé. Ici, tu définis un tag de structure nommé date, ce qui correspond à T, mais la section type_ident n'est pas présente. Comme première amélioration, on pourrait donc rajouter l'identificateur en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct date
    {
      int numj;
      char nomm[21];
      int an;
    } date;
    On notera qu'il est bien correct de déclarer deux identificateurs date, car ils appartiennent tous deux à des espaces de nom différents.

    Citation Envoyé par C11 (n1570), § 6.2.3 Name spaces of identifiers
    Thus, there are separate name spaces for various categories of identifiers, as follows:
    — label names (disambiguated by the syntax of the label declaration and use);
    — the tags of structures, unions, and enumerations (disambiguated by following any of the keywords struct, union, or enum);
    — the members of structures or unions; each structure or union has a separate name space for its members (disambiguated by the type of the expression used to access the member via the . or -> operator);
    — all other identifiers, called ordinary identifiers (declared in ordinary declarators or as enumeration constants).
    Tu noteras cependant qu'il est étrange de ta part d'utiliser les identificateurs date et struct date pour désigner le même type. Ce type de comportement est assez courant lorsqu'il y a une abstraction. En effet, l'appelant et l'appelé peuvent considérer un même type de deux manières différentes ; suivant si on regarde l'implémentation ou l'interface du module, dans le cas d'un type abstrait, par exemple. Cependant, lorsqu'il s'agit d'un simple raccourci de type comme c'est le cas ici, il n'y a aucune raison de vouloir le faire, sinon d'obfusquer volontairement le code. On notera par ailleurs que l'utilité de l'alias de type ici est souvent remise en cause par certaines normes de codage, comme la KNF d'OpenBSD ou même celles du noyau Linux.

    Problèmes logiques

    Ceci devrait déjà supprimer l'erreur de syntaxe signalée par ton compilateur. Ensuite, il y a un élément qui devrait gêner lors de l'exécution du code généré par le compilateur. En effet, les lvalues p->numj et p->an ont le type int dans la fonction affiche. De ce fait, les utiliser en argument de scanf, qui attend des pointeurs vers tes données, est incorrect. Il est nécessaire d'utiliser l'opérateur d'adressage & dans ces deux cas.

    Problèmes de sécurité

    L'utilisation de la fonction gets est dépréciée depuis plusieurs années, en raison d'une grosse faille de sécurité qui lui est intrinsèque. En effet, l'implémentation n'a pas à vérifier le nombre de caractères tapés par l'utilisateur, ce qui peut causé des écritures en dehors des zones allouées par ton programme. L'expérience a montré que ces bugs peuvent être exploités ; cela a par exemple été le cas avec le logiciel OpenSSL. De plus, gets est maintenant un obstacle à la portabilité, car il a été rendu optionnel par la norme C11. En C89 et en C99, l'utilisation de la fonction fgets est considérée comme une bien meilleure pratique.

    Problèmes de portabilité

    Un environnement dit « hôte », qui désigne couramment tous les systèmes qui implémentent correctement l'entièreté de la bibliothèque standard. C'est le cas de tous les systèmes d'exploitation utilisés couramment. Les erreurs qui te sont signalées semblent témoigner de ton utilisation de l'environnement de développement Visual Studio, qui est disponible sous les systèmes d'exploitation Microsoft Windows. Tes programmes devraient donc suivre les règles imposées par la norme au sujet des environnements hôtes, notamment ce qui concerne le prototype de la fonction main.

    Citation Envoyé par C11 (n1570), § 5.1.2.2.1 Program startup
    The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters [...] or with two parameters.
    Dans ton cas, main doit donc retourner une valeur de type int.

    Bonne soirée !

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    un grand merci pour votre aide

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

Discussions similaires

  1. Problème de char dans un pointeur de structure
    Par Odawin dans le forum Débuter
    Réponses: 4
    Dernier message: 29/04/2013, 17h02
  2. Problème projet iterateur + pointeur de structure
    Par RedDrak dans le forum Débuter
    Réponses: 10
    Dernier message: 27/11/2010, 01h29
  3. problème de pointeurs vers structure
    Par fred_sell dans le forum Débuter
    Réponses: 17
    Dernier message: 07/07/2009, 01h33
  4. Petit problème sur pointeurs de structures
    Par benjaminb dans le forum C
    Réponses: 5
    Dernier message: 05/01/2008, 20h08
  5. problème pointeur sur structure
    Par lejohn dans le forum C
    Réponses: 9
    Dernier message: 01/05/2007, 13h17

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