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 :

une structure en paramètre de fonction


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut une structure en paramètre de fonction
    Bonjour,
    ça fait pratiquement tte l'après-midi que j'essaie de débugger mon programme mais en vain! voici le code:

    Dans un fichier.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    extern struct Liste {
           char ss_Liste[4][21];
    }  LISTE;
     
     
    extern const char  Sous_MENU_LISTE[18][21] ;
    Dans un fichier.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Affichage_structure_chaine_CGRAM_DDRAM ( Liste structure , unsigned char adr_ecran)
    {
     
        mLCDPutCmd(adr_ecran); // c'est une macro permettant d'afficher sur un LCD à la position voulu sur l'écran , elle est déclarée ailleurs dans le projet (en global)..    
     
       pointeur_ss_menu = &structure; // il pointe sur la structure de chaine de char à afficher, il est déclaré ailleurs dans le projet (en global)..
     
    }
    en fait j'ai créé un sous menu qui contient 18 lignes de topics, et vu que mon LCD est un 4*20alors j'ai créé la structure qui prendra à chaque fois 4 éléments pour les envoyé par l'intermédiaire de la fonction d'affichage sur l'écran. voici le code de la fonction qui permet d'attribuer à cette structure le sous menu:

    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
     
    /*****************************************************************************
     * Fonction: Attrib_Liste_Sous_MENU()
     * entrees: int compteur de positionnement, unsigned int direction (haut ou bas)
     * sorties: pointeur sur les 4 lignes de char à afficher
     *****************************************************************************/
     struct *  Attrib_Liste_Sous_MENU(int cnt_pos_ss_menu, unsigned int direction){
     
        unsigned char index; 
        unsigned char ligne_ecran;
        unsigned char colonne_ecran;
        int increment_pos_ss_menu;
        unsigned char nb_lignes_clignotement;
        int Bouton;
     
     	if (BtnIsPressed(Bp_DEFILER_HAUT)) {
           Bouton = Bp_DEFILER_HAUT;
        }
        else if (BtnIsPressed(Bp_DEFILER_BAS)) {
           Bouton = Bp_DEFILER_BAS;
        }    
        direction = _button_press.bBouton ;
     
        switch (index){
           case 1: case 4: case 8: case 10: case 14: case 16:
               increment_pos_ss_menu  = 2;
               nb_lignes_clignotement = 2;
           break;
     
           default:
               increment_pos_ss_menu  = 1;      
               nb_lignes_clignotement = 1;
           break;
        }
     
        switch(direction) {
          case Bp_DEFILER_HAUT:
             if (cnt_pos_ss_menu>0){
             cnt_pos_ss_menu - increment_pos_ss_menu;
             }else {
              cnt_pos_ss_menu = 17;
             }
          case Bp_DEFILER_BAS:
              if (cnt_pos_ss_menu<17){
             cnt_pos_ss_menu + increment_pos_ss_menu;
             }else {
              cnt_pos_ss_menu = 0;
             }
     
         }
     
         for (ligne_ecran= 0; ligne_ecran <=3 ; ligne_ecran++) {
            for (colonne_ecran= 0; colonne_ecran <=21 ; colonne_ecran++) {
                 LISTE.ss_Liste[ligne_ecran][colonne_ecran] = Sous_MENU_LISTE[cnt_pos_ss_menu+ligne_ecran ][colonne_ecran];    
             }
        }
        pointeur_ss_menu = &LISTE;
        return pointeur_ss_menu;
     }
    si vs n'arrivez pas à interpreter des ligne c'est normal car les détails figurent ailleurs concernant les macros que j'utilise..mais l'essenciel c'est que le compilateur m'envoie cette erreur: "error: syntax error before 'structure'", erreur correspondant au paramètre d'entrée de la fonction d'affichage.


    ps: - je travaille sur un PIC24FJ128GA010 et j'utilise la version8.10 de MPLAB
    - j'ai déjà essayé de mettre "struct" à la place de "Liste" dans le paramètre d'entrée de la fonction d'affichage, mais ça ne marche pas non plus.

    merci de m'aider pcq je ne vois plus rien!!

  2. #2
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Salut,

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    struct *  Attrib_Liste_Sous_MENU(){}

    Je dirais qu'il manque un nom de structure ici, genre :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    struct maStructure * Attrib_Liste_Sous_MENU(){}

    et puis là je ferais :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    void Affichage_structure_chaine_CGRAM_DDRAM ( Liste structure , unsigned char adr_ecran){}

    en

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    void Affichage_structure_chaine_CGRAM_DDRAM ( struct Liste structure , unsigned char adr_ecran){}

    Bonne journée,
    T.
    Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    merci pour la rapidité!

    ah bon il faut mettre un nom pour le parametre de sortie d'une fonction? pourtant quand il s'agit par exemple de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int nom_de_la_fonction (parametres)
    on ne met pas de nom au "int"!!

  4. #4
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par nikita_sophie Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Affichage_structure_chaine_CGRAM_DDRAM ( struct Liste structure , unsigned char adr_ecran){}
    j'ai déjà essayé ça mais ça ne marche pas!

  5. #5
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Citation Envoyé par nikita_sophie
    ah bon il faut mettre un nom pour le parametre de sortie d'une fonction?
    Ta fonction retourne un type "struct maStructure *" qui est définit lors de la définition de ta structure :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct maStructure {
          int a;
          int b;
          int c;
    };

    Pour l'autre je vois pas alors, tu à bien le "#include "fichier.h"" dans "fichier.c" ?
    Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/

  6. #6
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    oui j'ai bien le #include

  7. #7
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    donc à ton avis je devrais mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct * LISTE Attrib_Liste_Sous_MENU()  {}
    ?

  8. #8
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    Bonjour,

    voila les proto de tes 2 fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void Affichage_structure_chaine_CGRAM_DDRAM ( struct Liste structure , unsigned char adr_ecran)
     
     struct Liste *  Attrib_Liste_Sous_MENU(int cnt_pos_ss_menu, unsigned int direction)
    Le C (encore moins que beaucoup d autre langage) n'est pas un jeu de hasard.

    Apres pour plus d aide il me faudrait un bout de code qui compile
    "vaste programme"

  9. #9
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    bonjour,

    merci pour la réponse, je vais essayer avec ces protos alors

  10. #10
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    ça marche pas et ça me plante tt le reste du projet!!!!

  11. #11
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Salut,

    Inutile de s'énerver, ou ton ordinateur passera pas la semaine...
    Bon je suis pas un expert du C, mais la définition "extern" devant ta stucture me paraît douteuse, puisque cette opérateur est appliqué aux variables normalement.

    J'aurais plutôt écrit un truc de ce style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct Liste {
           char ss_Liste[4][21];
    }  LISTE;
     
    extern LISTE taVariable;
    Et pour tes fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Affichage_structure_chaine_CGRAM_DDRAM ( LISTE structure , unsigned char adr_ecran)
    {
     
        mLCDPutCmd(adr_ecran); // c'est une macro permettant d'afficher sur un LCD à la position voulu sur l'écran , elle est déclarée ailleurs dans le projet (en global)..    
       
       pointeur_ss_menu = &structure; // il pointe sur la structure de chaine de char à afficher, il est déclaré ailleurs dans le projet (en global)..
       
    }

    De plus quel est l'intérêt de renvoyer un pointeur LISTE dans ta fonction Attrib_Liste_Sous_Menu si tu utilise une variable globale ?
    Soit tu n'as pas cette variable globale et tu choisit de renvoyer une 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
    17
    18
    19
    20
     LISTE*  Attrib_Liste_Sous_MENU(int cnt_pos_ss_menu, unsigned int direction){
     
        unsigned char index; 
        unsigned char ligne_ecran;
        unsigned char colonne_ecran;
        int increment_pos_ss_menu;
        unsigned char nb_lignes_clignotement;
        int Bouton;
    	LISTE* aListe = NULL;
     
    	....
    
         for (ligne_ecran= 0; ligne_ecran <=3 ; ligne_ecran++) {
            for (colonne_ecran= 0; colonne_ecran <=21 ; colonne_ecran++) {
                 aListe.ss_Liste[ligne_ecran][colonne_ecran] = Sous_MENU_LISTE[cnt_pos_ss_menu+ligne_ecran ][colonne_ecran];    
             }
        }
       
        return aListe;
     }
    Soit du modifie ta variable globale dans ta fonction et tu ne renvoi rien (ou un code d'erreur )...Même si je déconseille cette méthode et l'utilisation de variables globales...
    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
     void  Attrib_Liste_Sous_MENU(int cnt_pos_ss_menu, unsigned int direction){
     
        unsigned char index; 
        unsigned char ligne_ecran;
        unsigned char colonne_ecran;
        int increment_pos_ss_menu;
        unsigned char nb_lignes_clignotement;
        int Bouton;
     
    	....
    
         for (ligne_ecran= 0; ligne_ecran <=3 ; ligne_ecran++) {
            for (colonne_ecran= 0; colonne_ecran <=21 ; colonne_ecran++) {
                 pointeur_ss_menu.ss_Liste[ligne_ecran][colonne_ecran] = Sous_MENU_LISTE[cnt_pos_ss_menu+ligne_ecran ][colonne_ecran];    
             }
        }
     }
    A+.
    For crying out loud !

  12. #12
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    merci bcp! je vais essayer tes propositions

  13. #13
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    alors, j'ai essayé la premiere proposition pour le moment, il me renvoie une erreur : syntax error before 'structure', correspondant à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Affichage_structure_chaine_CGRAM_DDRAM ( LISTE structure , unsigned char adr_ecran);

  14. #14
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    j'ai aussi essayé la 2eme solution, ça renvoie la même erreur!

  15. #15
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    et si je mets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Affichage_structure_chaine_CGRAM_DDRAM ( struct LISTE structure , unsigned char adr_ecran)
    ça me renvoie:
    parameter 1 ('structure') has incomplete type

  16. #16
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Tu as la sortie complète du compilateur dans un premier temps ?
    Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/

  17. #17
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Je viens de faire le test chez moi, et le compilateur ne me pose pas de problèmes quand j'écrit:
    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
    typedef struct Liste {
           char ss_Liste[4][21];
    }  LISTE;
     
    extern LISTE aL;
     
     void  Attrib_Liste_Sous_MENU(int cnt_pos_ss_menu, unsigned int direction){  
    {
        unsigned char index; 
        unsigned char ligne_ecran;
        unsigned char colonne_ecran;
        int increment_pos_ss_menu;
        unsigned char nb_lignes_clignotement;
        int Bouton;
     
     
         for (ligne_ecran= 0; ligne_ecran <=3 ; ligne_ecran++) {
            for (colonne_ecran= 0; colonne_ecran <=21 ; colonne_ecran++) {
                 aL.ss_Liste[ligne_ecran][colonne_ecran] = Sous_MENU_LISTE[cnt_pos_ss_menu+ligne_ecran ][colonne_ecran];    
             }
        }
     
    }
    As-tu modifier aussi la déclaration de la structure comme je te l'ai indiqué ?
    For crying out loud !

  18. #18
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Tchetch Voir le message
    Tu as la sortie complète du compilateur dans un premier temps ?
    je ne comprends pas ta question !

    Citation Envoyé par PadawanDuDelphi Voir le message
    As-tu modifier aussi la déclaration de la structure comme je te l'ai indiqué ?
    oui j'ai bien modifié la déclaration

  19. #19
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Tout les messages que ton compilateur produit, là où tu as le message d'erreur.
    Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/

  20. #20
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    ah !! oui ya tout

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/03/2014, 23h10
  2. Contenu d'une variable et paramètres de fonction
    Par antrax2013 dans le forum Langage
    Réponses: 7
    Dernier message: 31/03/2010, 10h58
  3. structure et paramètres de fonction
    Par tom31 dans le forum Débuter
    Réponses: 1
    Dernier message: 12/01/2008, 08h33
  4. Passage d'une structure en paramètre
    Par NeraOne dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/05/2007, 18h16
  5. Gtk: problème pour passer une structure en paramètres
    Par C_Chaou dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 19/04/2007, 19h29

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