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 :

envoyer un double tableau dans une fonction de type structure


Sujet :

C

  1. #1
    Membre habitué Avatar de awesomeman
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 166
    Points : 136
    Points
    136
    Par défaut envoyer un double tableau dans une fonction de type structure
    bonsoir,
    Juste avant que je parte féter l'année 2016, j'ai une question assez complexe (enfin je trouve)..
    Mon programme doit ouvrir un fichier ini (que je passe en paramètre), grace au données de ce fichier je dois dessiner une carte comme dans le jeu wolfenstein (les 1 correspondant aux murs et les 0 à un vide), je lui fait lire le contenue du fichier sans problème mais pour afficher la carte c'est autre chose.Ce n'est pas un problème d'algo car je sais quoi faire et j'arrive déjà à dessiner un carré dans ma fentre .En fait je ne vois pas comment utiliser mes données de mon fichier ini (que j'ai stocké dans str) au sein de ma fonction t_bunny_reponse loop, je ne vois pas comment passer str en paramètre vu que loop est utilisé bizarement , enfin utilisé en tant que paramètre d'une autre fonction de ma lib graphique ( bunny_set_loop_main_function)...
    Je tiens à présicer que cette fonction provient de la librairie graphique (que je dois utiliser) .
    Je suis certain que j'ai du mal expliqué certaines choses donc n'hésité pas à me poser des questions !

    Pour le moment j'affiche ça, c'est la taille de la map, largeur , hauteur et représentation:
    100
    width:10 height:10
    1 1 1 1 1 1 1 1 1 1
    1 0 0 0 0 1 0 0 0 1
    1 0 0 0 0 1 0 0 0 1
    1 0 0 1 0 1 0 1 0 1
    1 0 0 1 0 1 1 1 0 1
    1 0 0 1 0 0 0 0 0 1
    1 0 0 1 1 1 0 1 0 1
    1 0 0 0 0 1 0 1 0 1
    1 0 0 0 0 1 0 0 0 1
    1 1 1 1 1 1 1 1 1 1

    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
    int main(int ac, char **av)
    {
      t_bunny_window        *win;
      t_bunny_ini           *ini;
      char **str;
      size *sizemap;
     
      str = NULL;
      if (av[1] != NULL)
        ini = bunny_load_ini(av[1]);
      else
        {
          printf("no argument\n");
          return(1);
        }
      str = getmap(ini, str, sizemap, i);
      win = bunny_start(800, 800 ,false, "wolf");
      bunny_set_loop_main_function(loop);
      bunny_loop(win, 7, win);
      bunny_delete_ini(ini);
      free(str);
      return (0);
    }
    fonction d'affichage de la fenetre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    t_bunny_response        loop(void *i)
    {
      t_bunny_window        *win;
      t_bunny_pixelarray    *pix;
     
      win = i;
      pix = bunny_new_pixelarray(800, 800);
      background(pix);
      bunny_blit(&win->buffer, &pix->clipable, 0);
      bunny_display(win);
      bunny_delete_clipable(&pix->clipable);
      return (GO_ON);
    }
    définition de la fonction loop:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef t_bunny_response	(*t_bunny_loop)(void  *your_data);
    Bonnes fetes !!

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Je n'ai pas été lire la documentation de ta bibliothèque mais a priori c'est également bunny_loop qui récupère les arguments du callback loop contenus dans i. Comme tu veux probablement passer str en plus de (et non pas à la place de) win, tu dois créer une structure spécifique pour contenir tes paramètres, dont le pointeur sera à son tour aliasé en void * :
    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
    struct loop_args {
        t_bunny_window *win;
        char          **str;
    };
     
    t_bunny_response loop(void *args) {
        struct loop_args *params = (struct loop_args *)args;
        t_bunny_window *win = params->win;
        char          **str = params->str;
     
        // ...
    }
     
    int main(int argc, char *argv[]) {
        t_bunny_window *win;
        char          **str;
     
        // ...
     
        struct loop_args args = { win, str };
        // passage de &args via bunny_loop, je te laisse écrire l'appel car je ne connais pas le proto de la fonction
     
        // ...
    }

  3. #3
    Membre habitué Avatar de awesomeman
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 166
    Points : 136
    Points
    136
    Par défaut
    Bonjour,
    Déjà merci,le programme compile bien avec la structure mais segfault vers la fin de la fonction loop.
    je n'ai pas l'impression que str (et win ) sont bien passé passé dans ma structure param car il m'est impossible de faire par exemple printf("%s", param->str[2]).
    plus précisement la fonction segfault au niveau de bunnt_blit et bunny display.
    ducoup j'ai bien une fenetre qui s'ouvre mais elle n'affiche pas d'image et se ferme presque immédiatement à cause du segfault..

    fonction loop:
    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
    t_bunny_response        loop(void *arg)
    {
            argloop *param = (argloop *)arg;
            t_bunny_window *win = param->win;
            char **str = param->str;
      t_bunny_pixelarray    *pix;
      int x;
      int y;
     
      x = 0;
      y = 1;
      pix = bunny_new_pixelarray(800, 800);
      background(pix);
      while(y != 79)
      {
      tek_pixel(x, y, pix);
      x++;
      if (x == 80)
      {
      y++;
      x = 0;
      }
      }
      printf("salut\n"); 
      bunny_blit(&win->buffer, &pix->clipable, 0);
      bunny_display(win);
      bunny_delete_clipable(&pix->clipable);
      return (GO_ON);
    }

    main:
    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
    int main(int ac, char **av)
    {
      t_bunny_ini           *ini;
      size *sizemap;
      argloop *arg;
      arg = malloc(sizeof(*arg));
     
      arg->str = NULL;
      sizemap = NULL;
      if (av[1] != NULL)
        ini = bunny_load_ini(av[1]);
      else
        {
          printf("no argument\n");
          return(1);
        }
      arg->str = getmap(ini, arg->str, sizemap);
      arg->win = bunny_start(800, 800 ,false, "wolf");
      bunny_set_loop_main_function(&loop);
      //segfault ici
      bunny_loop(arg->win, 3, arg->win);
      //segfault ici
      bunny_delete_ini(ini);
      free(arg->str);
      return (0);
    }

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Relis bien ton code, c'est le bazar complet dans ta fonction main.

    Au hasard :
    • tu ne libères jamais le bloc mémoire renvoyé par malloc, essaie d'abord de faire fonctionner ton code avec une structure allouée sur la pile (comme dans mon exemple), ça te retire déjà une source d'erreur ;
    • tu ne passes jamais de paramètre de type argloop à la fonction loop, ton cast ne peut donc pas fonctionner.

  5. #5
    Membre habitué Avatar de awesomeman
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 166
    Points : 136
    Points
    136
    Par défaut
    désolé, j'avais pas regardé le proto de bunny_loop ..
    y suffisait de remplacer le troisième argument par arg, maintenant ça marche nickel, merci

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

Discussions similaires

  1. return de double tableau dans une autre fonction
    Par awesomeman dans le forum C
    Réponses: 9
    Dernier message: 21/12/2015, 22h37
  2. retour d'un tableau dans une fonction
    Par FlyByck dans le forum Delphi
    Réponses: 3
    Dernier message: 19/01/2007, 00h00
  3. Réponses: 1
    Dernier message: 28/12/2006, 17h02
  4. [langage] appel d'un tableau dans une fonction
    Par donny dans le forum Langage
    Réponses: 11
    Dernier message: 13/11/2006, 16h17
  5. Accéder à un tableau dans une fonction
    Par valanagrid dans le forum C++
    Réponses: 10
    Dernier message: 18/09/2006, 16h08

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