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 appel de fonction avec structure en argument


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut Problème appel de fonction avec structure en argument
    Bonjour,

    main.c :
    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 "sub.h"
     
    struct test
    {
    	int x;
    	int y;
    	int *p;
    };
     
    int add(struct test *ts)
    {
    	return ts->x + ts->y + (*ts->p);
    }
     
    int main(void)
    {
    	struct test *ts;
    	ts = malloc(sizeof(*ts));
     
    	ts->x = 8;
    	ts->y = 2;
    	ts->p = &ts->y;
     
    	printf("%i\n", add(ts));
    	printf("%i\n", sub(ts));
     
    	return 0;
    }
    sub.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <stdio.h>
     
    int sub(struct test *ts)
    {
    	return ts->x - ts->y - (*ts->p);
    }
    sub.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int sub(struct test *ts);
    Me retourne avec gcc :
    In file included from main.c:3:
    sub.h:1:16: warning: ‘struct test’ declared inside parameter list will not be visible outside of this definition or declaration
    1 | int sub(struct test *ts);
    | ^~~~
    main.c: In function ‘main’:
    main.c:27:21: warning: passing argument 1 of ‘sub’ from incompatible pointer type [-Wincompatible-pointer-types]
    27 | printf("%i\n", sub(ts));
    | ^~
    | |
    | struct test *
    In file included from main.c:3:
    sub.h:1:22: note: expected ‘struct test *’ but argument is of type ‘struct test *’
    1 | int sub(struct test *ts);
    | ~~~~~~~~~~~~~^~
    sub.c:3:16: warning: ‘struct test’ declared inside parameter list will not be visible outside of this definition or declaration
    3 | int sub(struct test *ts)
    | ^~~~
    sub.c: In function ‘sub’:
    sub.c:5:11: error: dereferencing pointer to incomplete type ‘struct test’
    5 | return ts->x - ts->y - (*ts->p);
    | ^~

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    L'ordre de lecture des instructions et des données compte.

    Ainsi, la définition de la structure doit arriver avant le prototype
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int sub(struct test *ts);
    Déplacer la définition de la structure dans le fichier .h avant le prototype et tout fonctionnera.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    Si je déplace la structure dans sub.h et avant le prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct test
    {
    	int x;
    	int y;
    	int *p;
    };
     
    int sub(struct test *ts);
    J'ai toujours des problèmes :
    sub.c:3:16: warning: ‘struct test’ declared inside parameter list will not be visible outside of this definition or declaration
    3 | int sub(struct test *ts)
    | ^~~~
    sub.c: In function ‘sub’:
    sub.c:5:11: error: dereferencing pointer to incomplete type ‘struct test’
    5 | return ts->x - ts->y - (*ts->p);
    |

  4. #4
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Hum, est-ce que vous voyez un include de sub.h dans sub.c ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <stdio.h>
     
    int sub(struct test *ts)
    {
    	return ts->x - ts->y - (*ts->p);
    }
    Non ?


    Alors comment voulez vous que sub.c connaisse le format de la structure ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    Ah oui, oubli.

    Merci.

  6. #6
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Du moment que vous n'oubliez pas le TAG resolu... ca va...

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

Discussions similaires

  1. Appel de fonction avec une structure en argument
    Par devilezf dans le forum Débuter
    Réponses: 8
    Dernier message: 06/03/2017, 12h44
  2. [Prototype] Ajax.Request et onSuccess : appel de fonction avec plusieurs arguments
    Par gregbond dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 18/10/2012, 17h00
  3. appel d'une fonction avec pointeur comme argument
    Par airness86180 dans le forum Débuter
    Réponses: 1
    Dernier message: 06/03/2009, 13h34
  4. Réponses: 3
    Dernier message: 23/08/2007, 00h39
  5. problème d'appel de fonction avec bind (en Tkinter)
    Par piotrr dans le forum Tkinter
    Réponses: 4
    Dernier message: 09/05/2007, 19h39

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