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 :

Utiliser une structure comme argument d'une fonction


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2009
    Messages : 24
    Points : 20
    Points
    20
    Par défaut Utiliser une structure comme argument d'une fonction
    Bonjour,
    je débute en C, et j'ai quelques difficultés à utiliser les structures avec des fonctions malgré les tutoriels que j'ai lu sur le sujet.
    Voici ma structure et mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    typedef struct {
    				  unsigned char UCH_d;
    				  unsigned char UCH_u;
    				  unsigned char UCH_p;
    		                  }s_afficheur;
            void main(void)
            {
    //ensuite je modifie les composantes de ma structure
            s_afficheur.UCH_d = CHAR_1;
    	s_afficheur.UCH_u = CHAR_7;
    	s_afficheur.UCH_p = POINT_OFF;
    //et j'appelle la fonction qui utilise la structure
    F_afficher(s_afficheur);
            }
    J'aimerai comprendre comment utiliser ma structure dans la fonction.
    Merci pour votre aide.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Attention, il y a une légère confusion entre type et variable.

    Utiliser un type dans une fonction n'a rien de trop sorcier.
    On peut écrire :

    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
    typedef struct {
        unsigned char UCH_d;
        unsigned char UCH_u;
        unsigned char UCH_p;
    } s_AFFICHEUR;
     
    /* affichage du s_AFFICHEUR passé en paramètre */
    void F_afficher(s_AFFICHEUR afficheur) 
    {
        printf("d %d\n", afficheur.UCH_d);
        printf("u %d\n", afficheur.UCH_u);
        printf("p %d\n", afficheur.UCH_p);
    }
     
     
    int main(void)
    {
        /* déclaration d'une variable aff de type s_AFFICHEUR*/
        s_AFFICHEUR aff;
     
        /* ensuite je modifie les composantes de ma variable */
        aff.UCH_d = CHAR_1;
        aff.UCH_u = CHAR_7;
        aff.UCH_p = POINT_OFF;
     
        /* et j'appelle la fonction qui utilise la variable*/
        F_afficher(aff);
        return 0;
    }

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Qu'est-ce que s_afficheur1 ? Il n'est déclaré nulle part.

    J'aimerai comprendre comment utiliser ma structure dans la fonction.
    Ben, tu peux l'utiliser de manière tout ce qu'il y a de plus classique. Là, dans ton exemple, tu envoies une copie de la structure vers la fonction, qui devient un objet local (qui sera donc détruit une fois la fonction terminée). Pour l'utiliser, c'est comme tu le ferais de manière normale.
    Après, si tu veux modifier la structure envoyée depuis la fonction "main" à partir de la fonction "F_afficher", tu dois utiliser un pointeur.
    Mais comme tu ne donnes aucune précision sur ce que tu veux vraiment faire, ça va être compliqué de t'aider. Tu veux faire quoi, concrètement ?

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Salut !

    Tu as ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct {
    				  unsigned char UCH_d;
    				  unsigned char UCH_u;
    				  unsigned char UCH_p;
    		                  }s_afficheur;
    Dans le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            void main(void)
            {
    //ensuite je modifie les composantes de ma structure
            s_afficheur1.UCH_d = CHAR_1;
    	s_afficheur1.UCH_u = CHAR_7;
    	s_afficheur1.UCH_p = POINT_OFF;
    //et j'appelle la fonction qui utilise la structure
    F_afficher(s_afficheur);
            }
    Ceci est faux. Il faut declarer une "variable" de type s_afficheur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            void main(void)
            {
            // Declaration d'une variable de type s_afficheur
            s_afficheur UneInstance;
    
            //ensuite je modifie les composantes de ma structure
            UneInstance.UCH_d = CHAR_1;
    	UneInstance.UCH_u = CHAR_7;
    	UneInstance.UCH_p = POINT_OFF;
    //et j'appelle la fonction qui utilise la structure
    F_afficher(UneInstance);
            }
    et dans F_afficher ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void F_afficher (s_afficheur UneInstance)
    {
       ....
    }

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2009
    Messages : 24
    Points : 20
    Points
    20
    Par défaut
    Bonjour à tous et merci pour vos réponses,
    Je viens d'essayer la solution de SofEvans et de mabu.
    Pour les deux j'avais une erreur de syntaxe au niveau de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s_AFFICHEUR UneInstance;
    et de :
    ensuite j'ai mis en commentaire dans mon main deux fonctions que je ne vous avais pas donné car je ne pensais pas qu'elles jouaient un rôle dans mes erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void main(void)
    {
    //F_init_hard();
    //F_init_afficheur();
    ...
    }
    et je pense toujours que cela n'a rien a voir donc je ne comprends pas ce qu'il se passe.
    Pour jeroman excuses-moi de ne pas être assez précis mais je ne sais pas vraiment comment expliquer les problèmes que je rencontre en C.

    Cependant les réponses que j'ai eu m'ont permis de mieux comprendre l'utilisation des structures et je pense pouvoir m'en sortir désormais.
    Merci

  6. #6
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par guilermo Voir le message
    Bonjour à tous et merci pour vos réponses,
    Je viens d'essayer la solution de SofEvans et de mabu.
    Pour les deux j'avais une erreur de syntaxe au niveau de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s_AFFICHEUR UneInstance;
    et de :
    ensuite j'ai mis en commentaire dans mon main deux fonctions que je ne vous avais pas donné car je ne pensais pas qu'elles jouaient un rôle dans mes erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void main(void)
    {
    //F_init_hard();
    //F_init_afficheur();
    ...
    }
    et je pense toujours que cela n'a rien a voir donc je ne comprends pas ce qu'il se passe.
    Pour jeroman excuses-moi de ne pas être assez précis mais je ne sais pas vraiment comment expliquer les problèmes que je rencontre en C.

    Cependant les réponses que j'ai eu m'ont permis de mieux comprendre l'utilisation des structures et je pense pouvoir m'en sortir désormais.
    Merci
    Pour moi c'est normal si tu as mis s_afficheur en majuscule.
    Reprens mon code mais met ceci comme structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct s_afficheur s_afficheur;
    struct s_afficheur
    {
    	unsigned char UCH_d;
            unsigned char UCH_u;
    	unsigned char UCH_p;
    };

  7. #7
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Le code de Mabu est bien, mais pourquoi ne pas utiliser les pointeurs? En embarqué, par exemple c'est une hérésie de passer une structure par la pile, les pointeurs sont faits pour ça.

    A+

    Pfeuh

    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
    #include <stdlib.h>
     
    typedef struct
    {
        unsigned char UCH_d;
        unsigned char UCH_u;
        unsigned char UCH_p;
    } s_AFFICHEUR;
     
    /* affichage du s_AFFICHEUR passé en paramètre */
    void F_afficher(s_AFFICHEUR* p_aff)
    {
        printf("d %d\n", p_aff->UCH_d);
        printf("u %d\n", p_aff->UCH_u);
        printf("p %d\n", p_aff->UCH_p);
    }
     
    int main(void)
    {
        /* déclaration d'un pointeur sur une structure de type s_AFFICHEUR*/
        s_AFFICHEUR* p_aff = malloc(sizeof(s_AFFICHEUR));
        if(p_aff == NULL)
            return 1;
     
        /* ensuite je modifie les composantes de ma variable */
        p_aff->UCH_d = 33;
        p_aff->UCH_u = 34;
        p_aff->UCH_p = 255;
     
        /* et j'appelle la fonction qui utilise la variable*/
        F_afficher(p_aff);
        return 0;
    }

  8. #8
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    [...]pourquoi ne pas utiliser les pointeurs? En embarqué, par exemple c'est une hérésie de passer une structure par la pile, les pointeurs sont faits pour ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* affichage du s_AFFICHEUR passé en paramètre */
    void F_afficher(s_AFFICHEUR* p_aff)
    {
        printf("d %d\n", p_aff->UCH_d);
        printf("u %d\n", p_aff->UCH_u);
        printf("p %d\n", p_aff->UCH_p);
    }
    Dans ce cas, attention aux erreurs potentielles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /* affichage du s_AFFICHEUR passé en paramètre 
       on affiche quelque chose seulement si p_aff est non NULL. */
    void F_afficher(s_AFFICHEUR* p_aff)
    {
        if(NULL != p_aff) {
            printf("d %d\n", p_aff->UCH_d);
            printf("u %d\n", p_aff->UCH_u);
            printf("p %d\n", p_aff->UCH_p);
        }
    }

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

Discussions similaires

  1. mettre une structure comme argument d'une fonction
    Par lahyouness dans le forum C++
    Réponses: 2
    Dernier message: 25/11/2014, 16h08
  2. Mettre une variable comme argument dans une fonction
    Par djun1 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 04/09/2012, 10h44
  3. Structure comme argument d'une fonction
    Par lagas12 dans le forum MATLAB
    Réponses: 1
    Dernier message: 08/08/2012, 17h14
  4. Réponses: 3
    Dernier message: 05/11/2009, 10h28
  5. une url comme argument d'une fonction
    Par khayyam90 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/10/2004, 20h15

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