Partage
  • Partager sur Facebook
  • Partager sur Twitter

[probleme] sur une fonction

Return

Sujet résolu
    7 juin 2006 à 17:21:54

    Bonjour
    Je fait un jeu (de strategie) en SDL et j'ai un petit probleme :-°
    Mon jeu fonctinne par tour
    Je suis en train de faire l'arbre des sciences qui se trouve dans une fonction.
    Quand on appelle cette fonction en fesant F2, on voit apparaitre l'arbre et on peut sélectionner la science que l'on veut developper.
    La fonction retourne une variable qui donne le numero de la science choisi.
    Et la normalement ça doit affiché :
    "science en developpement : Travail du bronze"

    Mais ça marche pas :(

    Voila les extrait de mon code :
    void jeu(SDL_Surface* ecran, int bool_ville, ville *capitale)//la fonction jeu
    {
    int numero_science_en_dev = 0;
    //...
    while (continuer)
    {
    //...
    sprintf(science_en_dev, "");
    switch(numero_science_en_dev)
    {
      case 0:
            sprintf(science_en_dev, "Science en devellopement : Aucune");       
            break;
      case 1:
            sprintf(science_en_dev, "Science en devellopement : Travail du bronze");
            break;
      case 2:
            sprintf(science_en_dev, "Science en devellopement : Agriculture");
            break;
    //...
    //si on fait F2 (je passe tout les switch)
    case SDLK_F2:
                     arbre(ecran, numero_science_en_dev, travail_bronze, agriculture, culte_mort,
                     outils, poterie, religion, travail_fer, construction,
                     art, techniques_combat, equitation);
                     break;
    }
    //...
    }
    //...
    }

    Et ma fonction arbre :
    //arbre des sciences
    int arbre(SDL_Surface* ecran, int numero_science_en_dev, int travail_bronze, int agriculture, int culte_mort, int outils, int poterie, int religion, int travail_fer, int construction, int art, int techniques_combat, int equitation)
    {
    //...
        case SDL_MOUSEBUTTONUP://si on clique sur travail du fer
                 if(event.button.x > 76 && event.button.y > 109 && event.button.x < 172 &&  event.button.y < 136 && travail_bronze != 1)
                 {//1
                    travail_bronze = 2;
                    numero_science_en_dev = 1;//=1
                    positionEnDev.x = 60;
                    positionEnDev.y = 116;
                 }
    //...
    return numero_science_en_dev;
    }

    J'ai fait des grossses coupe mais c'est ça.

    Et ça ne marche pas, ça compile sans bug mais ça affiche pas que l'on selectionner travail du bronze

    Si j'ai pas été assez precis dites le moi :euh:

    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      7 juin 2006 à 17:23:47

      C'est un peu normal, puisque tu ne récupère pas le return de ta fonction ... (Je n'ai pas regardé ta fonction, mais ca doit être ça...)

      [EDIT] Après avoir regardé, je confirme. D'ailleurs tu retourne le numéro en développement, mais il est aussi en paramètre ... pourquoi ?
      Donc soit récupère le return, soit utilise un pointeur : C'est pourtant expliqué que la fonction utilise une copie de numéroEnDev !
      • Partager sur Facebook
      • Partager sur Twitter
        7 juin 2006 à 17:25:30

        euh o_O j'ai pas compris !
        Comment qu'ont le recupère le return de la fonction ?
        J'ai un peut oublier les partie I et II (ça fait lomgtemps qu'elle sont sortie :-°
        [edit]
        ok je vais essayer ça, merci :D
        (si j'ai un probleme je reposterai alors je met pas tout de suite mon sujet en résolu)
        [/edit]
        • Partager sur Facebook
        • Partager sur Twitter
          7 juin 2006 à 17:31:11

          Même après des semaines d'ellipse, tu devrais t'en rappeler... Ce sont les bases tout de même. Je te conseille de les revoir quelque peu.

          Donc :
          Code de ma première solution :
          //appel :
          numero_science_en_dev = arbre(ecran, numero_science_en_dev, travail_bronze, agriculture, culte_mort, outils, poterie, religion, travail_fer, construction, art, techniques_combat, equitation);


          Deuxieme :
          //Fonction :
          void arbre(SDL_Surface* ecran, int *numero_science_en_dev /* etc */)
          {
             // ...
          }
          //appel :
          arbre(ecran, &numero_science_en_dev /* etc */);


          Au plaisir :)

          [EDIT] Je te conseille par ailleurs d'utiliser des structures ... Parce que là les paramètres sur plusieurs lignes [Juste pour des booléens ? o_O -> Utilise alors une énumération ! ] cela ne le fait pas vraiment...
          • Partager sur Facebook
          • Partager sur Twitter
            7 juin 2006 à 18:33:14

            Kid le prototype c'est :
            void arbre(SDL_Surface* ecran, int *numero_science_en_dev /* etc */);

            toi tu as mis la définition
            • Partager sur Facebook
            • Partager sur Twitter
              7 juin 2006 à 18:37:29

              Un truc me chagrine, l'utilisation du sprintf est elle bonne ? vu que le prorotype est

              int sprintf(char *chaine, const char *format, ...);

              Ne serait il pas judicieux d'utiliser strncpy(char *chaine, const char *chaineacopier, longueurmax);
              comme ça ça évite les dépassements de tampons
              • Partager sur Facebook
              • Partager sur Twitter
                7 juin 2006 à 18:42:28

                Oui désolé j'étais parti pour le proto ensuite j'avais commencé la définition ... et puis en fait ça m'a "saoûlé" donc voilà ^^

                tebomb -> Dans ce cas ci, sûrement. Mais il y a des fois où l'on ne connaît pas forcément la taille, et dans ces cas ci c'est plus simple un sprintf ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  7 juin 2006 à 18:59:03

                  Ok, j'ai resorti les cours, j'ai modifié, ça marche :D
                  Pour les structure, j'en ait utilisé pour d'autres truc mais la... :euh:

                  En tout cas, Merci :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 juin 2006 à 19:07:26

                    Boooooooonnn ok on va te le faire ...

                    //Contenu du header... structure publique
                    typedef struct st1
                    {
                      int numero_science_en_dev;
                      int travail_bronze;
                      int agriculture;
                      int culte_mort;
                      int outils;
                      int poterie;
                      int religion;
                      int travail_fer;
                      int construction;
                      int art;
                      int techniques_combat;
                      int equitation;
                    }SCIENCES;

                    /* Déclaration d'une variable de cette structure, avec initialisation (dans ton .c bien sûr) */
                    SCIENCES sciences = {0};

                    /* Manipulations dans ta fonction (avec pointeur de structure, pour pouvoir modifier) : */
                    void arbre(SDL_Surface *ecran, SCIENCES *sciences)
                    {
                      sciences->numero_science_en_dev = 0;
                      sciences->travail_fer = 1;
                      //...
                    }


                    C'est quand même plus propre comme ça non ?

                    P.S. Comme je l'ai dit plus haut, à la place des booléens, je mettrais plutôt une énumération ... Mais c'est déjà un bon début ;)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 juin 2006 à 20:25:28

                      Merci c'est simpa ! :D

                      Je vais le mettre
                      • Partager sur Facebook
                      • Partager sur Twitter

                      [probleme] sur une fonction

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown