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. #21
    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 ?

  2. #22
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Citation Envoyé par nikita_sophie Voir le message
    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
    Tu veux vraiment passer ta structure par valeur à ta fonction ? C'est rare qu'on fasse ça: Généralement, on passe juste un pointeur vers elle... Typiquement un pointeur const si la fonction ne la modifie pas...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #23
    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!

  4. #24
    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

  5. #25
    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 Médinoc Voir le message
    Tu veux vraiment passer ta structure par valeur à ta fonction ? C'est rare qu'on fasse ça: Généralement, on passe juste un pointeur vers elle... Typiquement un pointeur const si la fonction ne la modifie pas...
    ça voudrait dire que le "pointeur_ss_menu" que j'utilise à l'intérieur de la fonction "Affichage_structure_chaine_CGRAM_DDRAM" devrait etre passé en paramètre d'entrée?

  6. #26
    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
    Non, ca veut simplement dire que tu passes un pointeur de structure et pas la structure entière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Affichage_structure_chaine_CGRAM_DDRAM ( LISTE* structure , unsigned char adr_ecran)
    Ta fonction passe ainsi en paramètre uniquement un pointeur au lieu de ta structure entière (qui peut être très lourde parfois et ralentir ton exécution.
    De plus les paramètres passés par copie sont détruits à la fin de l'appel de ta fonction.

    Pour revenir à ton problème, je ne penses pas que ça vienne de la déclaration de la structure. Je ne connait pas MPLab, mais LISTE ne serait pas un mot clé ?

    A+.

  7. #27
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    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 487
    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 ?

  8. #28
    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 reglé le pb momentanément, vu que ma structure Liste ne contient qu'un seul élément jusqu'à mtn, je déclare uniquement un tableau de char au lieu d'une structure de tableau de char, et ça marche!! merci bcp pr vos suggestions si qlq1 arrive qd meme à voir d'où provenait l'erreur qu'il me prévienne svp!

    ps: le "LISTE" n'est pas un mot clé pr MPLAB, à ma connaissance..

  9. #29
    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..

  10. #30
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par nikita_sophie Voir le message
    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..
    Rassure-toi, ce n'est pas le cas!

  11. #31
    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 ça me rassure!!

  12. #32
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 102
    Par défaut
    Evite d'utiliser les "extern" comme ça, c'est sensé donné une information au linker, apparement ici tu n'en as pas besoin.
    Comme dit plus haut, tu passes un pointeur sur la structure, ça évite de devoir la pusher sur la stack lorsque tu call la fonction. Si ta structure fait 600B, c'est à chaque fois 600B à pusher sur la stack contre 4B (sur un ia32) pour un pointeur.

    J'aimerais que tu me dises les différences qu'il y a entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef struct Liste {
           char ss_Liste[4][21];
    }  Liste;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef struct Liste {
           char ss_Liste[4][21];
    }  LISTE;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef struct Liste {
           char ss_Liste[4][21];
    };

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct Liste {
           char ss_Liste[4][21];
    };

    Quand est-ce qu'on utilise le keyword "struct" ?

    Une fois que tu as répondu à ça, dis-moi quelle différence y'a entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void Affichage_structure_chaine_CGRAM_DDRAM ( LISTE structure , unsigned char adr_ecran)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void Affichage_structure_chaine_CGRAM_DDRAM (liste structure , unsigned char adr_ecran)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Affichage_structure_chaine_CGRAM_DDRAM ( LISTE * structure , unsigned char adr_ecran)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Affichage_structure_chaine_CGRAM_DDRAM (liste * structure , unsigned char adr_ecran)
    Lequel est juste, lequel est faux ? pourquoi ?

    Je pense que si tu fais ça, tu devrais être capable de trouver par toi toute seule ce qui va pas.

    +

  13. #33
    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);

  14. #34
    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
    Dans essai_variables.h tu déclares
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct Liste {
           char ss_Liste[4][21];
    } LISTE;

    et tu enlèves:
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    extern struct LISTE * pointeur_ss_menu

    Dans lcd.c en début de fichier, après les inclusions, tu ajoutes :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    extern LISTE * pointeur_ss_menu

    Dans MENU.c, tu enlèves :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct Liste {
           char ss_Liste[4][21];
    };

    ça devrait résoudre un peu le problème.

  15. #35
    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 bulki Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef struct Liste {
           char ss_Liste[4][21];
    }  Liste;
    +
    faux
    Citation Envoyé par bulki Voir le message
    [CODE]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef struct Liste {
           char ss_Liste[4][21];
    }  LISTE;
    +
    juste

    en fait, dans les 2 cas, on définit "Liste" de type structure, sauf que dans le 2ème cas on déclare une variable "LISTE" de type "Liste" qui est de type structure, alors que ds le 1er on déclare "Liste" ce qui est faux car ça ne correspond pas à la variable.

    Citation Envoyé par bulki Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef struct Liste {
           char ss_Liste[4][21];
    };
    +
    juste , on ne déclare pas de variable ici

    Citation Envoyé par bulki Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct Liste {
           char ss_Liste[4][21];
    };
    +
    juste aussi, mais je ne sais pas ce que ça change en omettant "typedef", pcq pr moi rien ke le fait de créer une structure et de lui donner un nom, ben ça voudrait dire qu'on a défini un type "structure"..

    Citation Envoyé par bulki Voir le message
    Quand est-ce qu'on utilise le keyword "struct" ?
    +
    c'est pas plutôt le mot clé "typedef" dont tu parles?


    Citation Envoyé par bulki Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void Affichage_structure_chaine_CGRAM_DDRAM ( LISTE structure , unsigned char adr_ecran)
    +
    faux, car "LISTE" est la variable et non pas le type. (mais pourtant dans mon programme j'ai qd meme fait ça au début pour tester car qd je mettais "Liste" ça ne marchait pas!)

    Citation Envoyé par bulki Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void Affichage_structure_chaine_CGRAM_DDRAM (liste structure , unsigned char adr_ecran)
    +
    juste, car "liste" est le type et on passe un paramètre de type "liste" qui est elle même une structure

    Citation Envoyé par bulki Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Affichage_structure_chaine_CGRAM_DDRAM ( LISTE * structure , unsigned char adr_ecran)
    +
    faux, pour la même raison puisque "LISTE" est la variable

    Citation Envoyé par bulki Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Affichage_structure_chaine_CGRAM_DDRAM (liste * structure , unsigned char adr_ecran)
    +
    juste, pour la meme raison aussi

  16. #36
    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 Tchetch Voir le message
    Dans essai_variables.h tu déclares
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct Liste {
           char ss_Liste[4][21];
    } LISTE;

    et tu enlèves:
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    extern struct LISTE * pointeur_ss_menu

    Dans lcd.c en début de fichier, après les inclusions, tu ajoutes :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    extern LISTE * pointeur_ss_menu

    Dans MENU.c, tu enlèves :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct Liste {
           char ss_Liste[4][21];
    };

    ça devrait résoudre un peu le problème.
    oki je vais tester ça! merci

    ps: je vais essayer d'envoyer un projet moins gros

  17. #37
    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
    pas la peine de tester ca.

    la seule solution est de lire un cours sur les structures et les types !
    C'est pas pareil.

    Je suis dsl si la phrase a une consonance seche mais tes posts sont trop petits pour etre correctement interprete et ton projet est trop volumineux.

    Et pis faut arreter le pifometre tu ne fais que perdre du temps.

    bon rapide aide memoire :
    si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct Liste_s
    {
     /* ce que tu veux comme membre */
    } Liste;
     
    /* la declaration de ta var */
    Liste ma_belle_liste; /* sans extern de preference c est sale */
    sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct Liste
    {
     /* ce que tu veux comme membre */
    } LISTE;
     
    /* la declaration d une autre varible */
    struct Liste ma_belle_liste; /* sans extern toujours de preference c est sale */
    tu vois la difference ?

  18. #38
    Membre averti
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Par défaut
    au fait j'ai une autre question à poser, si je veux une fonction qui retourne un pointeur vers un tableau de char, qu'elle est la syntaxe??pcq j'ai testé qlq possibilités mais ça n'a pas l'air d'être ça..la dernière que j'ai testée c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *  Attrib_Liste_Sous_MENU (int cnt_pos_ss_menu, unsigned int direction)[4][21]

  19. #39
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char **  Attrib_Liste_Sous_MENU (int cnt_pos_ss_menu, unsigned int direction)[4][21] )

  20. #40
    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 BainE Voir le message
    pas la peine de tester ca.

    la seule solution est de lire un cours sur les structures et les types !
    C'est pas pareil.
    ben je tiens à préciser que j'ai regardé pleins de doc avant de poster mon pb!! et si je l'ai posté c pcq je n'ai pas eu des reponses claires à mes interrogations sur ce que j'ai lu!!


    Citation Envoyé par BainE Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct Liste_s
    {
     /* ce que tu veux comme membre */
    } Liste;
     
    /* la declaration de ta var */
    Liste ma_belle_liste; /* sans extern de preference c est sale */

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct Liste
    {
     /* ce que tu veux comme membre */
    } LISTE;
     
    /* la declaration d une autre varible */
    struct Liste ma_belle_liste; /* sans extern toujours de preference c est sale */
    oui j'ai compris merci.

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