[C] tableau de pointeur dans un structure.
Répondre à la discussion
Affichage des résultats 1 à 24 sur 24

[C] tableau de pointeur dans un structure.



  1. #1
    Cech

    [C] tableau de pointeur dans un structure.


    ------

    Salut à tous !

    Je me demandais si par exemple j'avais

    Code:
    typedef struct{
        int **reel;
        int imaginaire;
    }Complexe;
    Comment faire pour accéder au int des réels à partir d'un pointeur sur la structure complexe ?

    Voici ma proposition qui est fausse sinon y'aurait pas de question
    Code:
    Complexe *i;
        i[0]->reel[0][0]= 1
    Ici j'ai essayé de demander : Pour le première élément du tableau de Complexe on va dans le premier tableau de pointeur int et enfin on va dans le premier int du premier tableau de pointeur int. Comment devrais-je m'y prendre ?

    -----

  2. #2
    Chanur

    Re : [C] tableau de pointeur dans un structure.

    il faut choisir :
    i[0].reel[0][0]
    ou bien :
    i->reel[0][0]
    Les deux sont synonymes.
    Mais bien sûr il faut d'abord avoir donné à i l'adresse d'une structure 'Complexe' valide, à i->reel l'adresse d'un tableau de 'int**' valide, et à chaque élément i->reel[k] que tu utiliseras l'adresse d'un tableau de 'int*' valide.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  3. #3
    Cech

    Re : [C] tableau de pointeur dans un structure.

    Salut Chanur.

    Ceci fonctionne, est-ce que vous m'avez conseillé ?

    Code:
    #include <stdio.h>
    
    typedef struct{
        int **reel;
        int imaginaire;
    }Complexe;
    
    
    main()
    {
        Complexe *i = calloc(sizeof(Complexe),1);
        i->reel = calloc(sizeof(int*),1);
        i->reel[0] = calloc(sizeof(int),1);
        i->reel[0][0] = 1;
        printf("%d",i->reel[0][0]);
    }

  4. #4
    Cech

    Re : [C] tableau de pointeur dans un structure.

    Parce que j'ai essayé d'utilisé la même idée pour une bibliothèque que je découvre et ça ne donne pas.
    Code:
    #include "ez-draw.h"
    #include "ez-image.h"
    
    
    typedef struct {
        Ez_image **images;
        Ez_window win1;
    } App_data;
    
    
    void app_data_init(App_data *a, char **filename)
    {
        a = calloc(sizeof(App_data),1);
        a->images = calloc(sizeof(Ez_image*),14);
        a->images[0] = calloc(sizeof(Ez_image),1);
    
        int i;
        for(i=0;i<14;i++){
            a->images[i][0] = ez_image_load(*(filename+i));
        if(a->images[i][0] == NULL) exit (1);
        }
    }

  5. A voir en vidéo sur Futura
  6. #5
    Chanur

    Re : [C] tableau de pointeur dans un structure.

    Ça ne marche pas parce qu'il faut initialiser TOUS les pointeurs de a->images, et pas seulement le premier.
    D'autre part, c'est parce que c'est un code de test que vous utilisez des tableaux à une seule case ? parce que sinon, je ne vois pas l'intérêt par rapport à une variable simple.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  7. #6
    Cech

    Re : [C] tableau de pointeur dans un structure.

    Oui exactement c'est juste pour le teste ^^.
    Je vais réfléchir à ça merci.

  8. #7
    Cech

    Re : [C] tableau de pointeur dans un structure.

    J'ai l'impression que je demande : pour le App_data a aller dans le tableau de pointeur sur image nommé images. Puis remplir de pointeur ce tableau et chaque pointeur pointe sur un unique élément. Qu'ai-je fais de pas bien ?

  9. #8
    Chanur

    Re : [C] tableau de pointeur dans un structure.

    a->image pointe vers une liste de 14 éléments

    a->image[0] pointe vers une liste de 1 élément
    a->image[1] n'est pas initialisé (ou plutôt, il est initialisé à 0 par calloc)
    a->image[2] idem
    ...
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  10. #9
    Cech

    Re : [C] tableau de pointeur dans un structure.

    Oui je vois, en fait la bibliothèque Ez_draw propose une fonction ez_load_image("filename") qu'il convenait d'utiliser voici le code :

    Le code est composé de plusieurs idée :
    - Afficher un squelette de fenêtre dans laquelle plusieurs formes géométriques vont occuper l'espace.
    - Parmi ces formes plusieurs carrés seront "remplis" par des images de 64 pixel, c'est les carrés de inventaire.
    Jusqu'ici le code fonctionne, et je remercie chanur pour son aide.

    - A présent j'aurais aimé entourez par un carré rouge une image de l'inventaire et pouvoir déplacer le carré rouge d'une part avec le flèche directionnelle et d'autre part la souris (dans ce code je n'ai pas encore attaqué le problème de la souris car le clavier fait bogué mon programme).

    Code:
    #include "ez-draw.h"
    #include "ez-image.h"
    
    
    typedef struct {
        Ez_image **images;
        Ez_window win1;
    } App_data;
    
    typedef struct {
        int *x, *y, *r;
    } Mes_donnees;
    
    void app_data_init(App_data *a, char **filename)
    {
        int i;
        a->images = calloc(sizeof(Ez_image*),14);
        for(i=0;i<14;i++){
        a->images[i] = ez_image_load(*(filename+i));
        if(a->images[i] == NULL) exit (1);
        }
    }
    
    
    void app_data_destroy(App_data *a)
    {
        int i;
        for(i=0;i<14;i++){
            ez_image_destroy(a->images[i]);
        }
    }
    
    int inventaire_selec(Ez_window win)
    {
        Mes_donnees *md = ez_get_data (win);
    
        ez_set_color (ez_red);
        ez_set_thick (2);
        if(*md->x == 150){
                ez_draw_rectangle (win, *md->x, *md->y, *md->x +64, *md->y + 64);
                return 1;
        }
        if(*md->x == 1046){
                ez_draw_rectangle (win, *md->x, *md->y, *md->x +64, *md->y + 64);
                return 1;
        }
        if(*md->r == 1){
            ez_draw_rectangle (win, *md->x+64, *md->y, *md->x +128, *md->y + 64);
            return 1;
        }
    
        if(*md->r == -1){
            ez_draw_rectangle (win, *md->x-64, *md->y, *md->x, *md->y + 64);
            return 1;
        }
    
        else {return 0;}
    }
    
    void win1_on_expose (Ez_event *ev)
    {
        ez_set_color (ez_black);
        ez_set_thick (1);
        ez_draw_text (ev->win, EZ_TC,1200,20, "%s", "Information debug");
        ez_draw_text (ev->win, EZ_TC,100,20, "%s \n %s", "Minecraft 2D by J&M","Informations et instructions");
        int i,j;
        for(i=0;i<7;i++){
            for(j=1;j<21;j++){
                ez_draw_rectangle(ev->win,64*j,120+(64*i),64*(j+1),120+(64*(i+1)));
            }
        }
        ez_draw_text (ev->win, EZ_TC,100,650, "%s", "Inventaire : ");
        for(j=0;j<14;j++){
                ez_draw_rectangle(ev->win,150+(64*j),618,150+(64*(j+1)),682);
                ez_draw_text(ev->win,EZ_TC,(150+(64*j)+150+(64*(j+1)))/2,690,"%d",0);
        }
        ez_draw_text (ev->win, EZ_TC,100,750, "%s", "Craft rules : ");
        for(j=0;j<3;j++){ez_draw_rectangle(ev->win,150+(64*j),718,150+(64*(j+1)),782);}
        ez_draw_line(ev->win,360,750,400,750);
        ez_fill_triangle(ev->win,400,730,400,770,450,750);
        for(j=0;j<2;j++){ez_draw_rectangle(ev->win,470+(64*j),718,470+(64*(j+1)),782);}
    
        App_data *a = ez_get_data(ev->win);
    
        for(i=0;i<14;i++){
           ez_image_paint(a->win1, a->images[i], 150+(64*i), 618);
        }
    
        inventaire_selec(a->win1);
    }
    
    void win1_on_key_press (Ez_event *ev)
    {
        Mes_donnees *md = ez_get_data (ev->win);
        int booly = 1, booln = -1;
    
        App_data *a = ez_get_data (ev->win);
    
        switch (ev->key_sym){
            case XK_q        : ez_quit (); break;
            case XK_KP_Left  : md->r = &booln ;break;
            case XK_KP_Right : md->r = &booly ;break;
            default          : return;
        }
        ez_send_expose (a->win1);
    }
    
    void win1_on_key_release (Ez_event *ev)                      /* Key released */
    {
            switch (ev->key_sym){
            case XK_q : ez_quit (); break;
        }
    }
    
    void win1_on_button_press (Ez_event *ev)             /* Mouse button pressed */
    {
        return;
    }
    
    
    void win1_on_button_release (Ez_event *ev)          /* Mouse button released */
    {
        return;
    }
    
    void win1_on_motion_notify (Ez_event *ev)                     /* Mouse moved */
    {
        return;
    }
    
    
    void win1_event (Ez_event *ev)
    {
        switch (ev->type) {
            case Expose          : win1_on_expose    (ev); break;
    
            case KeyPress        : win1_on_key_press (ev); break;
            case KeyRelease      : win1_on_key_release      (ev); break;
    
            case ButtonPress     : win1_on_button_press     (ev); break;
            case ButtonRelease   : win1_on_button_release   (ev); break;
            case MotionNotify    : win1_on_motion_notify    (ev); break;
    
            default :
                 printf ("Unknown event : %d\n", ev->type);
        }
    }
    
    
    int main (int argc, char *argv[])
    {
        char **filename = calloc(sizeof(char*),14);
        *filename = "squelette_minecraft2D/images/air.png";
        *(filename+1) = "squelette_minecraft2D/images/ashes.png";
        *(filename+2) = "squelette_minecraft2D/images/fire.png";
        *(filename+3) = "squelette_minecraft2D/images/flower.png";
        *(filename+4) = "squelette_minecraft2D/images/gem.png";
        *(filename+5) = "squelette_minecraft2D/images/gold.png";
        *(filename+6) = "squelette_minecraft2D/images/grass.png";
        *(filename+7) = "squelette_minecraft2D/images/iron.png";
        *(filename+8) = "squelette_minecraft2D/images/money.png";
        *(filename+9) = "squelette_minecraft2D/images/plank.png";
        *(filename+10) = "squelette_minecraft2D/images/rock.png";
        *(filename+11) = "squelette_minecraft2D/images/soil.png";
        *(filename+12) = "squelette_minecraft2D/images/water.png";
        *(filename+13) = "squelette_minecraft2D/images/wood.png";
    
        App_data a;
    
        /*if (argc-1 != 1)
             fprintf (stderr, "Usage: %s image\n", argv[0]);
        else filename = argv[1];*/
    
        Mes_donnees *md = malloc(sizeof(Mes_donnees));
        int rec_x = 150, rec_y = 100, rec_r = 0;
    
        if (ez_init() < 0) exit (1);
        app_data_init (&a, filename);
    
        md->x = &rec_x; md->y = &rec_y; md->r = &rec_r;
    
        a.win1 = ez_window_create (1280,800, "Chinecraft 2D", win1_event);
        ez_set_data (a.win1, &a);
        ez_window_dbuf(a.win1, 1);
    
        ez_set_data (a.win1, md);
    
        ez_main_loop ();
    
        app_data_destroy (&a);
        exit(0);
    }

  11. #10
    Chanur

    Re : [C] tableau de pointeur dans un structure.

    La fonction win1_on_key_press met dans md->r l'adresse d'une variable automatique.
    C'est très vilain !
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  12. #11
    Cech

    Re : [C] tableau de pointeur dans un structure.

    Même l'idée était vilaine il y avait beaucoup plus simple grâce au structure :
    Code:
    #include "ez-draw.h"
    #include "ez-image.h"
    
    
    typedef struct {
        Ez_image **images;
        Ez_window win1;
        int* position;
    } App_data;
    
    void app_data_init(App_data *a, char **filename)
    {
        int i;
        a->images = calloc(sizeof(Ez_image*),14);
        for(i=0;i<14;i++){
        a->images[i] = ez_image_load(*(filename+i));
        if(a->images[i] == NULL) exit (1);
        }
    }
    
    
    void app_data_destroy(App_data *a)
    {
        int i;
        for(i=0;i<14;i++){
            ez_image_destroy(a->images[i]);
        }
    }
    
    
    void win1_on_expose (Ez_event *ev)
    {
        ez_set_color (ez_black);
        ez_set_thick (1);
        ez_draw_text (ev->win, EZ_TC,1200,20, "%s", "Information debug");
        ez_draw_text (ev->win, EZ_TC,100,20, "%s \n %s", "Minecraft 2D by J&M","Informations et instructions");
        int i,j;
        for(i=0;i<7;i++){
            for(j=1;j<21;j++){
                ez_draw_rectangle(ev->win,64*j,120+(64*i),64*(j+1),120+(64*(i+1)));
            }
        }
        ez_draw_text (ev->win, EZ_TC,100,650, "%s", "Inventaire : ");
        for(j=0;j<14;j++){
                ez_draw_rectangle(ev->win,150+(64*j),618,150+(64*(j+1)),682);
                ez_draw_text(ev->win,EZ_TC,(150+(64*j)+150+(64*(j+1)))/2,690,"%d",0);
        }
        ez_draw_text (ev->win, EZ_TC,100,750, "%s", "Craft rules : ");
        for(j=0;j<3;j++){ez_draw_rectangle(ev->win,150+(64*j),718,150+(64*(j+1)),782);}
        ez_draw_line(ev->win,360,750,400,750);
        ez_fill_triangle(ev->win,400,730,400,770,450,750);
        for(j=0;j<2;j++){ez_draw_rectangle(ev->win,470+(64*j),718,470+(64*(j+1)),782);}
    
        App_data *a = ez_get_data(ev->win);
    
        for(i=0;i<14;i++){
           ez_image_paint(a->win1, a->images[i], 150+(64*i), 618);
        }
    
        inventaire_selec(ev,a);
    }
    
    void win1_on_key_press (Ez_event *ev)
    {
        App_data *a = ez_get_data (ev->win);
    
        switch (ev->key_sym){
            case XK_q        : ez_quit (); break;
            case XK_Left  : *a->position-=1 ;break;
            case XK_Right : *a->position+=1 ;break;
            default          : return;
        }
        ez_send_expose (a->win1);
    }
    
    void win1_on_key_release (Ez_event *ev)
    {
            switch (ev->key_sym){
            case XK_q : ez_quit (); break;
        }
    }
    
    void win1_on_button_press (Ez_event *ev)
    {
        App_data *a = ez_get_data (ev->win);
    
        ez_window_get_id(ev->win);
        int i;
        for(i=0;i<14;i++){
                if( (ev->mx >=150+(64*i)) && (ev->my >= 618) && (ev->mx <= 150+(64*(i+1))) && (ev->my <= 682) ){
                    *a->position = i;
                    ez_send_expose (a->win1);
                }
        }
        return;
    }
    
    
    void win1_on_button_release (Ez_event *ev)
    {
        return;
    }
    
    void win1_on_motion_notify (Ez_event *ev)                     /* Mouse moved */
    {
        return;
    }
    
    
    void win1_event (Ez_event *ev)
    {
        switch (ev->type) {
            case Expose          : win1_on_expose           (ev); break;
    
            case KeyPress        : win1_on_key_press        (ev); break;
            case KeyRelease      : win1_on_key_release      (ev); break;
    
            case ButtonPress     : win1_on_button_press     (ev); break;
            case ButtonRelease   : win1_on_button_release   (ev); break;
            case MotionNotify    : win1_on_motion_notify    (ev); break;
    
            default :
                 printf ("Unknown event : %d\n", ev->type);
        }
    }
    
    
    int main (int argc, char *argv[])
    {
        char **filename = calloc(sizeof(char*),14);
        *filename = "squelette_minecraft2D/images/air.png";
        *(filename+1) = "squelette_minecraft2D/images/ashes.png";
    
        /*if (argc-1 != 1)
             fprintf (stderr, "Usage: %s image\n", argv[0]);
        else filename1 = argv[1];*/
    
        *(filename+2) = "squelette_minecraft2D/images/fire.png";
        *(filename+3) = "squelette_minecraft2D/images/flower.png";
        *(filename+4) = "squelette_minecraft2D/images/gem.png";
        *(filename+5) = "squelette_minecraft2D/images/gold.png";
        *(filename+6) = "squelette_minecraft2D/images/grass.png";
        *(filename+7) = "squelette_minecraft2D/images/iron.png";
        *(filename+8) = "squelette_minecraft2D/images/money.png";
        *(filename+9) = "squelette_minecraft2D/images/plank.png";
        *(filename+10) = "squelette_minecraft2D/images/rock.png";
        *(filename+11) = "squelette_minecraft2D/images/soil.png";
        *(filename+12) = "squelette_minecraft2D/images/water.png";
        *(filename+13) = "squelette_minecraft2D/images/wood.png";
    
        App_data *a = calloc(sizeof(App_data),1);
    
        a->position = calloc(sizeof(int),1);
        *a->position = 0;
    
        if (ez_init() < 0) exit (1);
        app_data_init (a, filename);
    
    
        a->win1 = ez_window_create (1280,800, "Chinecraft 2D", win1_event);
        ez_set_data (a->win1, a);
        ez_window_dbuf(a->win1, 1);
    
        ez_main_loop ();
    
        app_data_destroy (a);
        exit(0);
    }

  13. #12
    Cech

    Re : [C] tableau de pointeur dans un structure.

    Bref ! Pour en revenir au sujet initiale. Je rencontre un nouveau problème d'allocution.

    J'ai un pointeur une structure :
    Code:
    typedef struct {
        /** @brief État courant */
        State state; 
        /** @brief Inventaire */
        Inventaire inventaire;
        /** @brief Indice du matériau courant dans l'inventaire */ 
        int selection; 
        /** @brief Tableau des règles de crafting */
        Regle * regles; 
        /** @brief Taille du tableau de règles */
        int num_regles; 
        /** @brief Indice de la règle courante */
        int regle_selectionnee;
        /** @brief Terrain de jeu */ 
        GigaTerrain Gigaterrain; 
        /** @brief Position du personnage */
        Personnage personnage; 
        /** @brief Tableau des images des matériaux */
        Ez_image* tiles[NB_MATERIAUX];
        /** @brief Image du personnage */ 
        Ez_image* character; 
    	/** @brief selection dans l'inventaire */ 
    	int* position_inventaire;
    	
    } Game;
    Et j'aimerais alloué le champ Gigaterrain
    Code:
    typedef Materiau GigaTerrain[H_GIGATERRAIN][L_GIGATERRAIN];
    Voici comment j'ai procédé :
    Code:
    Game* game_parameters = calloc(sizeof(Game),1);
    
        game_parameters->Gigaterrain = calloc(sizeof(Materiau*),H_GIGATERRAIN);
        int i,j;
        for(i=0;i<H_GIGATERRAIN;i++){
                game_parameters->Gigaterrain[i] = calloc(sizeof(Materiau),L_GIGATERRAIN);
        }
    Mon idée est simple j'ai donne H_GigaTerrain tableaux de matériaux qui contiennent L_GigaTerrain de materiaux. Pourquoi ça ne donne pas ?

  14. #13
    Chanur

    Re : [C] tableau de pointeur dans un structure.

    Parce que, dans la structure Game, Gigaterrain est déjà un tableau. C'est à dire un pointeur constant. On ne peut pas lui affecter de valeur.
    Il n'y a rien a allouer, puisqu'il est déjà alloué à l'alloc de game_parameter.
    C'est la solution la plus simple, quand on connais à l'avance les dimensions du tableau.

    PAr contre, si les dimensions H_GIGATERRAIN et L_GIGATERRAIN étaient variables, on ne pourrait pas et ton allocation serait correcte, mais il faudrait déclarer "Materiau ** Gigaterrain;" dans la structure.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  15. #14
    Cech

    Re : [C] tableau de pointeur dans un structure.

    Oui je vois... Super, merci pour vos conseils, vous m'aidez beaucoup à avancer.

  16. #15
    Cech

    Re : [C] tableau de pointeur dans un structure.

    Re !

    J'ai mélangé les deux exemples :
    Code:
    typedef struct {
        int entree[14];
        int sortie[14];
    } Regle;
    
    typedef struct{
        Regle* regles;
        int* num_regles;
    }Mes_donnees;
    
    void main(){
        Mes_donnees *md = calloc(sizeof(Mes_donnees),1);
        md->regles = calloc(sizeof(Regle),50);
        md->num_regles = calloc(sizeof(int),1);
        int i,j;
    
        for(i=0;14;i++)
        md->regles[1].entree[i]=i;
    
        return;
    }

    Ici j'ai alloué de la mémoire pour mon tableau de regles. Puis si j'ai bien compris les deux champs de regles sont des pointeurs constants donc ils ont déjà de la place réservée. Deuxièmement j'ai ensuite demande de remplir le tableau entree de la regle n°1.

    Pouvez m'en dire plus s'il vous plait ?

  17. #16
    Chanur

    Re : [C] tableau de pointeur dans un structure.

    for(i=0;14;i++) signifie qu'on fait une boucle
    - en initialisant i à 0
    - tant que que 14 est différent de 0 (donc indéfiniment ...)
    - en incrémentant i après chaque itération

    J'imagine que tu voulais écrire :
    for(i=0; i<14; i++)
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  18. #17
    Cech

    Re : [C] tableau de pointeur dans un structure.

    oui mais ne vous en faite pas ce n'est pas aussi simple que cela, c'était un exemple simple mais le fond de ma question est pourquoi mon tableau d'entree (d'un autre code) est rempli d'adresse.

  19. #18
    Chanur

    Re : [C] tableau de pointeur dans un structure.

    Désolé mais je ne comprends pas la question. Comment ça "rempli d'adresses" ?
    "entree" est un tables d'int. Alloué avec calloc il est donc, au départ rempli de 0

    Mais manifestement ce n'est pas de ça dont tu parles.

    Sinon (à part la boucle for) je trouve le code correct ...
    Dernière modification par Chanur ; 11/04/2016 à 10h56.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  20. #19
    Cech

    Re : [C] tableau de pointeur dans un structure.

    Je me suis mal exprimé. Voilà une photo
    Nom : adre.jpg
Affichages : 665
Taille : 187,0 Ko



    Sur la photo on peut voir le printf des éléments d'un tableau et à partir de 0 on voit le printf des éléments d'un autre tableau. J'aurais aimé que le premier soit comme le deuxième, je cherche hum...

  21. #20
    Chanur

    Re : [C] tableau de pointeur dans un structure.

    Est-ce que tu peux le lancer sous debugger ?
    Ça permettrait de voir si le contenu de tes tableaux est correct juste après l'allocation et s'il l'est encore au moment du printf.
    Si ce n'est pas le cas, il suffit de regarder pas par pas pour voir à quel moment il change (écrasement ?)
    Sinon est-tu sûr de tes printf ? Quand le format ne colle pas avec les arguments qui suivent on peut avoir des résultats surprenants ...
    Tu fais tes allocations avec calloc (qui initialise la mémoire allouée à 0) ou avec malloc (qui n'initialise pas) ?

    Sans le code j'ai du mal à faire des hypothèses plus précises.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  22. #21
    Cech

    Re : [C] tableau de pointeur dans un structure.

    Le code n'est pas bien long c'est quelque chose du genre :

    Pour la structure :
    Code:
    typedef struct {
        /** @brief État courant */
        State state; 
        /** @brief Inventaire */
        Inventaire inventaire;
        /** @brief Indice du matériau courant dans l'inventaire */ 
        int selection; 
        /** @brief Tableau des règles de crafting */
        Regle* regles; 
        /** @brief Taille du tableau de règles */
        int* num_regles; 
        /** @brief Indice de la règle courante */
        int regle_selectionnee;
        /** @brief Terrain de jeu */ 
        GigaTerrain Gigaterrain; 
        /** @brief Position du personnage */
        Personnage* personnage; 
        /** @brief Tableau des images des matériaux */
        Ez_image* tiles[NB_MATERIAUX];
        /** @brief Image du personnage */ 
        Ez_image* character; 
    	/** @brief selection dans l'inventaire */ 
    	int* position_inventaire;
    	/** @brief Image du fond du jeu*/
    	Ez_image* weather;
    	/** @brief Image du fond de la fenêtre*/
    	Ez_image* fond;
    	
    } Game;

    J'ai initialisé de la sorte :

    Code:
        game_parameters->num_regles = calloc(sizeof(int),1);
    
        int N = compte_lignes("regles.txt");
    
        game_parameters->regles = calloc(sizeof(Regle),N);
    
        game_parameters->regles = lit_regles("regles.txt",game_parameters->num_regles);
    
        for(i=0;i<14;i++)
            printf("%d\n",game_parameters->regles[N].entree[i]);
    
        for(i=0;i<14;i++)
            printf("%d\n",lit_regles("regles.txt",game_parameters->num_regles)[1].entree[i]);

    Grâce à la fonction lit_regles qui lit des caractères dans un fichier txt et qui les stocke sous le type int (materiau) dans un tableau de règles (qui est une structure qui contient deux tableaux de int) (le passage se fait pas une fonction de conversion char2materiaux) qui ressemble à :
    Code:
    Regle* lit_regles(char* filename, int* num_regles)
    {
        int i=0, N = compte_lignes(filename);
        *num_regles = N;
        Regle* always = calloc(sizeof(Regle),N);
        FILE* fichier = fopen(filename, "r");
        char entree[50], sortie[50];
        if (fichier != NULL){
                while(fscanf(fichier,"%s %s", entree, sortie) == 2){
                    always[i] = char2Regle(entree,sortie);
                    i++;
                    }
            fclose(fichier);
            return always;
            }
        else{return NULL;}
    }

  23. #22
    Chanur

    Re : [C] tableau de pointeur dans un structure.

    Code:
        game_parameters->regles = calloc(sizeof(Regle),N);
    
    
        game_parameters->regles = lit_regles("regles.txt",game_parameters->num_regles);
    
    
        for(i=0;i<14;i++)
            printf("%d\n",game_parameters->regles[N].entree[i]);
    
    
        for(i=0;i<14;i++)
            printf("%d\n",lit_regles("regles.txt",game_parameters->num_regles)[1].entree[i]);
    game_parameters->regles est un tableau alloué à N valeurs
    game_parameters->regles[N] est donc à côté du tableau

    Par ailleurs (on s'en fout c'est un test) lit_regles("regles.txt",game_p arameters->num_regles)[1] planterait dans le cas où lit_regles retournerait NULL

    Attention aussi à ta fonction de lecture du fichier regles.txt : elle lit les valeurs par groupes de deux chaînes de caractères et les stocke dans un tableau alloué au nombre de lignes. Ça ne marche que si le fichier contient exactement deux chaînes de caractères par ligne

    Oups. Ça m'avait échappé : game_parameters->regles = calloc(sizeof(Regle),N) est inutile : tu remplace la valeur à la ligne qui suit. C'est lit_regle qui fait l'allocation utile. C'est une fuite de memoire.
    Dernière modification par Chanur ; 11/04/2016 à 13h22.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  24. #23
    Cech

    Re : [C] tableau de pointeur dans un structure.

    Voici un exemple de fichier regles.txt :
    =~ w
    w~ *
    T !!!!!!!!
    ## &
    &# &(

    On remarque qu'il a toujours un espace entre les matériaux en entrée et ceux en sortie, je m'en suis inspiré pour ma fonction .

    Ah oui je comprends pourquoi lit_regle fait l'allocation .

    Néanmoins que voulez vous dire par
    "
    game_parameters->regles est un tableau alloué à N valeurs
    game_parameters->regles[N] est donc à côté du tableau
    "
    ?

  25. #24
    Cech

    Re : [C] tableau de pointeur dans un structure.

    J'ai capito.

Discussions similaires

  1. problème syntaxe structure tableau pointeur en c
    Par kaky951357 dans le forum Programmation et langages, Algorithmique
    Réponses: 4
    Dernier message: 10/03/2016, 09h45
  2. langage c, entrer un tableau de structure dans une fonction
    Par invitecd37efaf dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 10/02/2013, 14h31
  3. Difference entre structure, pointeur, tableau (langage C).
    Par deyni dans le forum Programmation et langages, Algorithmique
    Réponses: 7
    Dernier message: 12/10/2012, 16h23
  4. Réponses: 5
    Dernier message: 07/02/2012, 19h14
  5. Problème Langage C Structure, Pointeur, ...
    Par invite3e43df7f dans le forum Logiciel - Software - Open Source
    Réponses: 17
    Dernier message: 01/04/2006, 21h14