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 :

typedef et pointeurs


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Points : 8
    Points
    8
    Par défaut typedef et pointeurs
    Bonjour,
    je bloque sur un petit programme composé de deux fonctions.
    j'ai d'abord crée un nouveau type item_t grâce au type def;
    dans le main je défini mes différentes variables et pointeurs
    la deuxième fonction permet de modifier les valeurs associé à mon nouveau type.
    Mais malheureusement ça ne marche pas j'ai cette erreur:
    error: passing argument 1 of ‘item_fill’ from incompatible pointer type [-Wincompatible-pointer-types]
    item_fill(&objet1, name1, nbr1);

    code :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct {char name[30] ;  
    	int quantite;} item_t;
     
    int item_fill(item_t* obj, char a[], int quantite);
     
    int inventory_display(item_t* tab);
     
    int inventory_add(item_t* inventory, item_t item);
     
     
    int main()
    {
    	int nbr1=1;
    	char nom1;
    	char* name1 = NULL;
    	item_t* objet1 = NULL;
    	name1=&nom1;
     
    	objet1 = (item_t*) malloc(30*sizeof(item_t));
    	scanf("%s",nom1);
    	/*scanf("%i",&nbr1);*/
     
    	item_fill(&objet1, name1, nbr1);
    	inventory_display(objet1);
    	printf("%i '%s' \n",objet1->quantite,objet1->name);
    	return 0;
    }
     
    int item_fill(item_t* obj, char* a, int quantite)
    {
    	strcpy(obj->name,a);
    	obj->quantite=quantite;
    	return 0;
    }

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    oups j'ai oublié un truc ;virez le 3eme prototype pour tester le programme, ça concerne la suite de mon programme qui ne nous intéresse pas ici

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Azghar Voir le message
    Mais malheureusement ça ne marche pas j'ai cette erreur:
    error: passing argument 1 of ‘item_fill’ from incompatible pointer type [-Wincompatible-pointer-types]
    item_fill(&objet1, name1, nbr1);

    code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main()
    {
    	item_t* objet1 = NULL;
    	item_fill(&objet1, name1, nbr1);
    }
    Bonjour

    Regarde le code suivant

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void fct(int *pt)
    {
         ...
    }
     
    int main()
    {
         int var;
         fct(&var);
    }

    var est de type "int". Son adresse "&var" étant donc l'adresse d'un int, sera alors stockée dans une variable dédiée aux stockages des adresses d'int, donc dans un "int étoile".

    Dans ton code, quel est le type de "objet1" ? Et donc quel type tu invoques quand tu appelles l'adresse "&objet1" ???

    Aide
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main()
    {
         int var;
         int *pt=&var
     
         // En utilisant "var"
         fct(&var);
     
        // En utilisant "pt"
         fct(...);
    }
    Que dois-je mettre dans les parenthèses (en utilisant "pt") pour que ma fonction "fct" reçoive ce qu'il faut ?

    Citation Envoyé par Azghar Voir le message
    oups j'ai oublié un truc ;virez le 3eme prototype pour tester le programme, ça concerne la suite de mon programme qui ne nous intéresse pas ici
    Déjà on s'en fout, un prototype en plus ne gêne en rien (c'est plutôt un prototype en moins qui peut gêner) mais sinon t'as vu que t'avais un bouton "modifier" ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    merci pour ta réponse,
    objet1 est de type item_t, le type que j'ai défini en haut si j'ai bien compris.
    dans les parenthèses de ton code , je mettrai : (*pt)
    J'ai bon ?

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Azghar Voir le message
    Citation Envoyé par Azghar Voir le message
    item_t* objet1
    objet1 est de type item_t, le type que j'ai défini en haut si j'ai bien compris.
    Non, sinon il y aurait écrit item_t objet1 or ce n'est pas ce que je vois dans ton premier code...

    Citation Envoyé par Azghar Voir le message
    dans les parenthèses de ton code , je mettrai : (*pt)
    J'ai bon ?
    Non mais c'est ma faute, j'ai écrit ça à la façon "raccourcie" dont on a l'habitude mais qui doit impérativement se lire d'une certaine façon...

    Je réécris mon second code de façon plus détaillée...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main()
    {
         int var;
         int * pt;
         pt=&var;
     
         // En utilisant "var"
         fct(&var);
     
        // En utilisant "pt"
         fct(...);
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    ah oui, objet1 est un pointeur de item_t
    dans ta fonction il faut mettre pt entre parenthèses alors
    j'ai modifié &objet1 par objet1 dans mon code à la ligne 28
    effectivement ça marche mais l'attribut name (je sais pas si on dit comme ça) de l'objet1 que je passe a la fonction fill n'est pas modifié on dirait puisque quand je vérifie le nom de l'objet1 il me renvoit ' ' alors que j'ai tappé clef dans la console

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Azghar Voir le message
    ah oui, objet1 est un pointeur de item_t
    Exact. objet1 est un "item_t étoile" (ce qui n'est absolument pas du tout pareil qu'un "item_t")

    Citation Envoyé par Azghar Voir le message
    dans ta fonction il faut mettre pt entre parenthèses alors
    Bien entendu. D'ailleurs puisqu'il est écrit que "pt" égale (égalité donc "pareil que") "&var", ça veut dire que partout où il est écrit "&var" (comme en ligne 8) on peut remplacer par "pt". Donc "pt" est de type "int étoile", si je passe "pt" à ma fonction elle reçoit alors bien un "int étoile" ce qui est conforme à ce qu'elle attend.

    Citation Envoyé par Azghar Voir le message
    j'ai modifié &objet1 par objet1 dans mon code à la ligne 28
    Exactement. C'est le même raisonnement qui s'applique. Puisque "objet1" est de type "item_t étoile", et que la fonction attend un "item_t étoile", c'est "objet1" qu'il faut passer et non "&objet1" (qui, lui, sera vu comme étant un "item_t étoile étoile" !!!). D'ailleurs je ne comprends même pas que tu aies fait l'erreur vu que le second paramètre est un "char étoile" et que tu lui passes "name1" (et non "&name1") !!!

    Citation Envoyé par Azghar Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char nom1;
    scanf("%s",nom1);
    effectivement ça marche mais l'attribut name (je sais pas si on dit comme ça) de l'objet1 que je passe a la fonction fill n'est pas modifié on dirait puisque quand je vérifie le nom de l'objet1 il me renvoit ' ' alors que j'ai tappé clef dans la console
    Hum, quelle est la définition d'un type "char" ??? Est-ce bien le bon type adéquat pour stocker une chaine ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    ah oui tu as raison j'ai oublié les crochets,
    parfait merci beaucoup mon code marche
    Le nom et la quantité de l'objet est bien mis a jour

    Il y a -t-il un moyen de ne pas définir la taille d'un char a son initialisation ?
    j'ai écris char nom1[30];

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Tu refais le même abus ou la même erreur : la taille d'un char est toujours de 1, on ne peut y stocker qu'un seul caractère. Toi, tu voulais dire "comme définir la taille d'une chaine de caractères". Les chaines de caractères ne sont pas évidentes en C, je te conseille de réviser un peu cette notion.

    Une chaine de caractères est une suite de caractères terminée par un caractère spécial, '\0' :
    http://emmanuel-delahaye.developpez....tique-c/#LIV-D
    http://c.developpez.com/cours/poly-c...=page_1#LI-C-3

    Pour stocker une chaine, il faut donc un tableau assez grand. Pour stocker "hello", il t'en faut 5 (4 pour "hello" + 1 pour le caractère spécial). Si tu souhaites demandée un texte au clavier à l'utilisateur, il faut que ton tableau soit assez grand pour la contenir. Voir https://gradot.wordpress.com/2013/05...-programmes-c/ qui montre ce problème avec gets() mais le problème est le même avec ton utilisation de scanf("%s", p) puisque dans les 2 cas, tu ne dis pas quelle longueur maximale ton tableau peut contenir. Je te conseille la lecture de cet article pour savoir comment bien lire les entrées claviers : http://emmanuel-delahaye.developpez....ees-solides-c/

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Azghar Voir le message
    Il y a -t-il un moyen de ne pas définir la taille d'un char a son initialisation ?
    La taille d'un char c'est "un char". Je pense que tu veux parler de la taille d'un tableau de char. Ben oui, c'est possible. Dans ce cas tu définis un pointeur "char étoile" puis, quand tu connais la taille que tu veux lui allouer tu appelles "malloc()" ou une fonction cousine (calloc/realloc). C'est d'ailleurs ce que tu as fait pour "objet1" (ce qui est assez dommage vu que sa taille étant connue, tu eus pu écrire directement item_t objet1[30] (et en plus ça ne changeait rien à la façon de t'en servir)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. pointeur ou typedef struct
    Par Noun-S dans le forum Langage
    Réponses: 3
    Dernier message: 27/04/2011, 15h35
  2. typedef de pointeur de fonction non défini
    Par wilval dans le forum Débuter
    Réponses: 3
    Dernier message: 03/03/2010, 15h17
  3. Typedef d'un tableau et pointeur
    Par LittleWhite dans le forum Débuter
    Réponses: 3
    Dernier message: 15/12/2009, 00h45
  4. typedef bool pointeur ?
    Par rimas2009 dans le forum Langage
    Réponses: 1
    Dernier message: 29/05/2009, 11h36
  5. Masquer un pointeur dans un typedef
    Par GyZmoO dans le forum C
    Réponses: 8
    Dernier message: 03/02/2007, 16h46

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