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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    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 chevronné Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    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.

  3. #3
    Membre averti
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    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
    Membre averti
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    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 chevronné Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    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" ?

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

  7. #7
    Membre émérite 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 : 43
    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
    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+.

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

  9. #9
    Membre averti
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    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);

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

  11. #11
    Membre averti
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    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

  12. #12
    Membre chevronné Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Par défaut
    Tu as la sortie complète du compilateur dans un premier temps ?

  13. #13
    Membre chevronné Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Par défaut
    Et serait-il possible d'avoir le code complet et compilable sur MPLab ?

  14. #14
    Membre averti
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Par défaut
    ok une minute!

  15. #15
    Membre averti
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Par défaut
    voici le projet!
    Fichiers attachés Fichiers attachés

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nikita_sophie Voir le message
    voici le projet!
    Trop gros. Poste une version compilable réduite au minimum qui montre le problème. (technique bien connue de résolution de bug)

    Je rappelle que si tu utilises une structure quelque part, elle doit avoir été définie avant.

    Si dans un header, il y a :
    il faut que T soit défini avant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct
    {
        ...
    }
    T;
     
    void f (T *p);

  17. #17
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Un truc qui n'a rien à voir, et je suppose que tu fais ta vie comme tu l'entends, mais quand je vois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    extern const char  Sous_MENU_LISTE[][21]  = {
    "Adresser les blocs  ",
    "Reprise adressage   ", 
    "des blocs           ", 
    "Consulter les blocs ", 
     
    "Remplacer les blocs ", 
    "en défaut           ",
    Je suppose que le trou en dessous de « Consulter les blocs » est dû au fait que cela correspond à une ligne vide sur ton afficheur, mais du coup, ça fait une entrée manquante dans ton tableau, et ça décale les index.

    Tu arrives à t'y retrouver ?

  18. #18
    Membre averti
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Je suppose que le trou en dessous de « Consulter les blocs » est dû au fait que cela correspond à une ligne vide sur ton afficheur, mais du coup, ça fait une entrée manquante dans ton tableau, et ça décale les index.

    Tu arrives à t'y retrouver ?
    non ça ne correspond pas à une ligne vide sur l'afficheur, c'est uniquement une lisibilité pr moi qd je vois mon programme (pour differencier les 4 lignes par 4). je ne savais pas que ça pouvait etre interpreté par le compilo en tant que ligne vide sur l'écran, puisque niveau syntaxe de ce code il n'y a pas de "guillemets" contenant une ligne vide..

  19. #19
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    bonjour a tous,

    je repasse en eclair pour avouer avoir dit un certains nombres de betises l autre jour, et noter avoir edité le post en question.

    voila, bonne journée

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