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 :

probleme d'envoi et de reception à une fonction


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut probleme d'envoi et de reception à une fonction
    Bonjour, j'ai essayé de créer une structure afin que mon timer l'envoie à une fonction, mais je n'ai pas réussi.
    Pouvez-vous me dire ce qui ne vas pas svp?
    Dans ma fonction principale, j'ai voila comment j'ai déclaré ma structure (ces sous-variables existent deja):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct PourChienr
    {
        SDL_Rect positionChienr[16];
        long variable;
    };
    Ensuite, (premiere erreur*) voila mon timer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(positionChienr[15].x != 350)
            {
            timer = SDL_AddTimer(1000, animChienr, &PourChienr);
            }
    *C:\Users\xavier\heenok\main.c|318|error: expected primary-expression before ')' token|

    Et enfin ma fonction(2eme erreur*):

    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
    Uint32 animChienr(Uint32 intervalle, void *parametre)
    {
        SDL_Rect* positionChienr = (SDL_Rect*)parametre;
         /* Conversion de void* en SDL_Rect* */
     
            positionChienr[variable].x = 100;
            positionChienr[variable].y = 100;
     
            variable ++;
     
            positionChienr[variable].x = 200 + variable * 10;
            positionChienr[variable].y = 400;
     
        return intervalle;
     
     
    }

    * C:\Users\xavier\heenok\main.c|1184|error: `variable' was not declared in this scope|

    ps: desolé pour les balises, je n'ai pas trouvé

  2. #2
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Août 2008
    Messages : 148
    Par défaut
    Bonjour,

    Alors, si je ne me trompe pas, les structures s'utilisent ainsi :

    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
     
    struct monBidule
    {
        int variable;
        char chaine[10];
    };
     
    monBidule monMachin;
    maFonction (&monMachin);
     
    // Au niveau de la fonction à présent
    void maFonction (monBidule* machin)
    {
        *machin.variable = 10;
        // ...
    }
    Voilà, j'ai mis le code en vrac mais c'est à peu près ça.

    Ton erreur vient du fait que tu mets directement le nom de la structure "PourChienr" ... d'où le problème.

    PS : ça fait lontemps que je n'ai pas revu ça donc désolé si les informations sont inexactes.

    Edit : Je viens de voir autre chose ... tu dis que les variables existent déja, mais il me semble également que cela ne doit pas être le cas ... elles doivent être créées dans la structure non ? En fait là tu essayes d'utiliser la structure comme un sac dans lequel tu mettrais ce qui t'intéresse histoire de te faciliter la vie avec les pointeurs, je me trompe ?

  3. #3
    Membre averti
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut
    salut et merci,
    Pour ton edit -> oui c'est exactement ça

    pour le reste j'ai vraiment du mal à concrétiser ce que tu me dis, j'aimerais bien qu'on me mette direct le code mais bon lol

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(positionChienr[15].x != 350)
            {
            timer = SDL_AddTimer(1000, animChienr, &PourChienr);
            }
    PourChienr n'est (probablement) pas une variable, donc on ne peut pas prendre son adresse (&PourChienr). Il est (probablement) plutôt un type d'ailleurs mal écrit, puisque le type que tu définis est struct PourChienr.
    Donc, dans ce cas, il faut créer une variable du type struct PourChienr, disons MonPourChienr, et passer son adresse à la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct PourChienr  MonPourChienr;
    ...
    timer = SDL_AddTimer(1000, animChienr, &MonPourChienr);
    Probablement, mais là aussi le code donné ne permet pas d'en être sûr, positionChienr doit être le champ (du même nom) d'une structure struct PourChienr créée.
    Auquel cas, on devrait avoir quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while(MonPourChienr.positionChienr[15].x != 350)
    ....
    Pour l'autre erreur, le message est clair, il n'existe pas de variable ou de constante identifiées par variable pour cette fonction

  5. #5
    Membre averti
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut
    Merci beaucoup,
    je vois tout ça demain, cours + votre aide, je vais bien finir par y arriver (enfin j'espere).

  6. #6
    Membre averti
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut
    Bonjour,
    Voila où j'en suis:
    Dans ma fonction principale je declare cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct PourChienr
    {
        SDL_Rect positionChienr[16];
        long variable;
    };
     
     struct PourChienr ensemble;
    Puis initialise cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for(i = 0; i < 16; i++)
        {
            ensemble.positionChienr[i].x = 100;
            ensemble.positionChienr[i].y = 100;
        }
     
        ensemble.positionChienr[0].x = 200;
        ensemble.positionChienr[0].y = 400;
        ensemble.variable = 0;
    Pour envoyer cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(ensemble.positionChienr[15].x != 350)
            {
            timer = SDL_AddTimer(1000, animChienr, &ensemble);
            }
    à cette fonction:
    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
    Uint32 animChienr(Uint32 intervalle, void *parametre)
    {
        struct PourChienr *ensemble = (struct PourChienr*)parametre;
         /* Conversion de void* en SDL_Rect* */
     
            ensemble.positionChienr[ensemble.variable].x = 100;
            ensemble.positionChienr[ensemble.variable].y = 100;
     
            ensemble.variable ++;
     
            ensemble.positionChienr[ensemble.variable].x = 200 + ensemble.variable * 10;
            ensemble.positionChienr[ensemble.variable].y = 400;
     
        return intervalle;
    }
    Resultat des courses, 10 erreurs dans cette derniere fonction:
    C:\Users\xavier\heenok\main.c|1194|error: request for member `positionChienr' in `ensemble', which is of non-class type `PourChienr*'|
    C:\Users\xavier\heenok\main.c|1194|error: request for member `variable' in `ensemble', which is of non-class type `PourChienr*'|
    C:\Users\xavier\heenok\main.c|1195|error: request for member `positionChienr' in `ensemble', which is of non-class type `PourChienr*'|
    C:\Users\xavier\heenok\main.c|1195|error: request for member `variable' in `ensemble', which is of non-class type `PourChienr*'|
    C:\Users\xavier\heenok\main.c|1197|error: request for member `variable' in `ensemble', which is of non-class type `PourChienr*'|
    C:\Users\xavier\heenok\main.c|1199|error: request for member `positionChienr' in `ensemble', which is of non-class type `PourChienr*'|
    C:\Users\xavier\heenok\main.c|1199|error: request for member `variable' in `ensemble', which is of non-class type `PourChienr*'|
    C:\Users\xavier\heenok\main.c|1199|error: request for member `variable' in `ensemble', which is of non-class type `PourChienr*'|
    C:\Users\xavier\heenok\main.c|1200|error: request for member `positionChienr' in `ensemble', which is of non-class type `PourChienr*'|
    C:\Users\xavier\heenok\main.c|1200|error: request for member `variable' in `ensemble', which is of non-class type `PourChienr*'|
    ||=== Build finished: 10 errors, 242 warnings ===|
    J'espere que vous m'aiderez...merci

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Uint32 animChienr(Uint32 intervalle, void *parametre)
    {
        struct PourChienr *ensemble = (struct PourChienr*)parametre;
    ....
    ensemble n'est donc pas un struct PourChienr mais un pointeur sur struct PourChienr.
    Pour accéder au champ d'une structure, on utilise l'opérateur . (point)
    Comme ensemble est un pointeur sur structure, la structure pointée est *ensemble et un champ de cette structure est donc
    (*ensemble).variable

    ce qu'on écrit habituellement avec l'opérateur -> de façon plus claire :
    ensemble->variable

    On doit donc avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            ensemble->positionChienr[ensemble->variable].x = 100;
            ensemble->positionChienr[ensemble->variable].y = 100;
    .....

  8. #8
    Membre averti
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut
    Merci,
    C'est ce que j'ai fais la mais j'obtient 21 erreurs à present...j'ai l'impression que je n'y arriverais jamais.

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Dans quel code ? Quels sont les messages d'erreur ?

  10. #10
    Membre averti
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut
    Le code est tres long, mais les erreurs viennent de cette fonction uniquement (animChienr)
    Voici les erreurs:

    C:\Users\xavier\heenok\main.c|1190|error: invalid conversion from `void*' to `PourChienr*'|
    C:\Users\xavier\heenok\main.c|1193|error: invalid use of undefined type `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1190|error: forward declaration of `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1193|error: invalid use of undefined type `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1190|error: forward declaration of `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1194|error: invalid use of undefined type `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1190|error: forward declaration of `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1194|error: invalid use of undefined type `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1190|error: forward declaration of `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1195|error: invalid use of undefined type `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1190|error: forward declaration of `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1197|error: invalid use of undefined type `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1190|error: forward declaration of `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1197|error: invalid use of undefined type `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1190|error: forward declaration of `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1197|error: invalid use of undefined type `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1190|error: forward declaration of `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1198|error: invalid use of undefined type `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1190|error: forward declaration of `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1198|error: invalid use of undefined type `struct PourChienr'|
    C:\Users\xavier\heenok\main.c|1190|error: forward declaration of `struct PourChienr'|
    ||=== Build finished: 21 errors, 242 warnings ===|

  11. #11
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    C:\Users\xavier\heenok\main.c|1193|error: invalid use of undefined type `struct PourChienr'|
    la définition de cette structure n'est pas "visible" par la fonction. Rechercher sa définition et faire qu'elle soit connue par la fonction animChienr (peut être manque t-il un #include ----.h)

  12. #12
    Membre averti
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut
    Merci pour ton aide,
    Je n'ai pas de fichiers .h, mais sur un autre forum on s'est aperçu qu'en fait je compilais en C++, apparament ça viendrait de là, donc je vais tout refaire demain, et voir si ça marche.

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Comme te l'as dit diogene, le mieux serait que tu ais un .h avec la définition de ta structure. Ensuite tu inclus ce .h dans les .c où tu l'utilise.
    Que la compilation soit en C ou en C++, vu ton programme, cela ne change pas grand chose.
    Lorsque dans ta fonction animChienr, tu déréférence ensemble->positionChienr[ensemble->variable], je te conseille vivement de tester au préalable ensemble->variable par rapport à 16. Sinon, ca risque d'exploser assez rapidement (en fait au bout de 15 appels à ta callback de ton timer).
    Enfin, dernier conseil, plutôt que d'utiliser la valeur 16, utilise une constante dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define NBR_POSITION 16
    struct PourChienr
    {
        SDL_Rect positionChienr[NBR_POSITION];
        long variable;
    };

  14. #14
    Membre averti
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut
    Merci pour vos reponses,
    Et tel quel, je ne peux pas faire fonctionner cela? juste modifier cette définition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct PourChienr
    {
        SDL_Rect positionChienr[16];
        long variable;
    };
    Ou celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct PourChienr ensemble;
    De façon à ce qu'elles ne soient pas inconnues dans la fonction animChienr.

    ps: pour la compilation en C je n'ai meme pas réussi, je ne sais pas ou est-ce qu'on peut régler ça dans code::blocks, j'ai juste créer un projet en SDL et obtenu un main.cpp que j'ai renommer "main.c",
    apparemment en C il n'y a pas besoin de faire de cast, mais en C++ si! C'est pour ça que ça m'inquiete un peu cette histoire aussi.

  15. #15
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Il faut mettre un peu d'ordre :

    1- créer un fichier .h, disons PourChienr.h

    2- Mettre dedans la définition de la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct PourChienr
    {
        SDL_Rect positionChienr[16];
        long variable;
    };
    mais PAS la définition de variables (comme struct PourChienr ensemble; ) : les définitions de variables se placent dans un .c

    3- Dans tous les fichiers .c (et éventuellement les autres fichiers .h) où on a besoin de connaître ce qu'est cette structure ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "PourChienr.h"

  16. #16
    Membre averti
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut
    Merci diogene,
    Finalement apres pas mal d'essais, j'ai fini par préférer utiliser des SDL_GetTicks, et ça se passe plutot bien.
    Merci à tous.
    J'ai bien noté vos conseils, tout de meme.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/04/2008, 14h40
  2. Réponses: 0
    Dernier message: 08/04/2008, 11h16
  3. Réponses: 11
    Dernier message: 07/01/2008, 19h47
  4. Réponses: 16
    Dernier message: 14/05/2007, 16h33
  5. Réponses: 7
    Dernier message: 20/03/2006, 12h19

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