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 :

Liste chaînée


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 39
    Par défaut Liste chaînée
    Bonjour, alors voilà nous sommes sur un projet d'informatique ou nous devons réaliser avec Allegro.

    Nous souhaiterions gérer la partie missile de notre programme grâce à une liste chaînée, or une erreur, au moins, subsiste dans notre programme puisque lorsque nous voulons tirer, Windows nous met une fenêtre d'erreur

    Je vous joint ci dessous, la bibliothèque, le main, et le sous programme d'ajout d'un maillon

    #ifndef TOTO
    #define TOTO

    #include <stdio.h>
    #include <allegro.h>
    #include <math.h>
    #include <string.h>
    #include <stdlib.h>


    #define ERREUR(){\
    set_gfx_mode(GFX_TEXT,0,0,0,0);\
    allegro_message(allegro_error);\
    allegro_exit();\
    return 1;\
    }
    #define ECRAN_X 800
    #define ECRAN_Y 600
    #define VIT_FD 1
    #define VIT_AV 1

    typedef struct ennemi_data
    {
    int ennemi_x;
    int ennemi_y;
    }t_enmi_data;

    typedef struct ennemi
    {
    t_enmi_data endat;
    struct ennemi*suiv;
    }t_enmi;


    typedef struct data_missile
    {
    int tir_x;
    int tir_y;
    }t_data_miss;

    typedef struct missil
    {
    t_data_miss emdat;
    struct missil *suiv;
    }t_miss;

    int menu(BITMAP*,BITMAP*);
    int options(BITMAP*);
    void tirer(t_miss*, BITMAP*, int , int );
    void affichage(BITMAP*,BITMAP*,BITMAP*,int,int,int,int,BITMAP*);
    void gestion(int*,int*);
    void game_timer(void);
    void game_sec_timer(void);
    volatile int game_time;
    volatile int sec_counter;
    t_miss* creation_maillon();
    void ajout_queue(t_miss*,t_miss*);



    #endif
    #include "biblio.h"

    int main()
    {
    //déclaration des variables
    BITMAP*fond[4],*buffer,*avion,*fd_menu,*tir1;
    int pos_x=ECRAN_X/2,pos_y=ECRAN_Y/2,k=0;
    int prog=0,i=0,done=0,ret_menu=0,exit=0,j=0;
    char temp[20];
    t_miss* ancre=NULL;
    ancre=(t_miss*)malloc(sizeof(t_miss));
    t_miss* missile=NULL;
    FILE*fp;


    //initialisation d'allegro
    allegro_init();
    install_keyboard();
    install_mouse();
    if(init_timer()!=0)ERREUR();
    set_color_depth(32);




    if(set_gfx_mode(GFX_AUTODETECT_WINDOWED,ECRAN_X,ECRAN_Y,0,0)!=0)ERREUR();
    buffer=create_bitmap(ECRAN_X,ECRAN_Y);


    //mise en place des ressources
    //show_mouse(screen);
    fd_menu=load_bitmap("menu1.bmp",NULL);
    avion=load_bitmap("avion2.bmp",NULL);
    tir1=load_bitmap("tir1.bmp",NULL);
    for(i=0;i<4;i++)
    {
    sprintf(temp,"fond%d.bmp",i);
    fond[i]=load_bitmap(temp,NULL);
    if(!fond[i])ERREUR();
    }
    if((fp=fopen("niveau1.txt","r"))!=0)
    {

    while(!exit)
    {
    ret_menu=menu(fd_menu,buffer);
    switch(ret_menu)
    {
    case 1:exit=1;
    break;

    case 2:

    //boucle évènementielle du jeu
    while(!key[KEY_ESC])
    {
    while(game_time>0)
    {
    gestion(&pos_x,&pos_y);
    if(key[KEY_SPACE])
    {
    missile=creation_maillon();
    ajout_queue(ancre,missile);
    tirer(missile,buffer,pos_x,pos_y);
    k=1;
    }
    --game_time;
    }

    affichage(fond[0],buffer,avion,pos_x,pos_y,prog,k,tir1);
    blit(buffer,screen,0,0,0,0,ECRAN_X,ECRAN_Y);

    //variation des vitesse
    if(prog>ECRAN_Y)prog=0;
    prog+= VIT_FD;

    if(missile!=NULL)
    missile->emdat.tir_y-=7;

    k=0;
    }
    }
    }

    }
    for(i=0;i<4;i++)destroy_bitmap(fond[i]);
    destroy_bitmap(avion);
    destroy_bitmap(buffer);
    return 0;
    }END_OF_MAIN();
    #include "biblio.h"

    void ajout_queue(t_miss*ancre,t_miss*maillon)
    {

    t_miss*curseur=ancre;

    if((ancre)==NULL)ancre=maillon;
    if((ancre)->suiv==NULL)(ancre)->suiv=maillon;
    else
    {
    while(curseur->suiv!=NULL)
    {
    curseur=curseur->suiv;
    }
    /*Ici se trouve une erreur sûre, on a tester avec des allegro_message("toto"); afin de chercher et trouver l'erreur*/
    curseur->suiv=maillon;
    }
    }
    Merci d'avance pour votre aide

  2. #2
    Membre chevronné Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Par défaut
    Si ancre vaut NULL alors curseur aussi, tu utilises curseur plus loin sans lui affecter une nouvelle valeur.

    Tu devrais plutôt placer cette ligne dans le else.

  3. #3
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Cette fonction ne fait pas ce que vous croyez... L'ajout à une liste chaînée n'est pas à faire à la légère et il faut bien comprendre ce qu'on fait...

    Premièrement:
    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
     void ajout_queue(t_miss*ancre,t_miss*maillon)
    {
     
      t_miss*curseur=ancre;
     
      if((ancre)==NULL)ancre=maillon;
      if((ancre)->suiv==NULL)(ancre)->suiv=maillon;
      else
      {  
        while(curseur->suiv!=NULL)
        {      
                            curseur=curseur->suiv;
        }
    /*Ici se trouve une erreur sûre, on a tester avec des allegro_message("toto"); afin de chercher et trouver l'erreur*/
        curseur->suiv=maillon;
        }
    }
    Devrait plutôt être:

    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
     void ajout_queue(t_miss*ancre,t_miss*maillon)
     {
          t_miss *curseur=ancre;
     
       if((ancre)==NULL)
       {
        ancre=maillon;
       }
    else /*IMPORTANT CE ELSE!!!*/
       {
       /* Je ne vois pas l'intérêt de ce test, il sera géré par le cas général
       if(ancre->suiv==NULL)
            {
            ancre->suiv=maillon;
            }
      */
           while(curseur->suiv!=NULL)
                   {      
              curseur=curseur->suiv;
              }
     
              curseur->suiv=maillon;
           }
     }
    Mais on remarque que vous pensez qu'en modifiant ancre, la variable ancre de la fonction appelante va être modifié... C'est faux, donc :

    Ne sera jamais pris en compte dans la fonction appelante...

    Généralement, on change le prototype de la fonction:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     t_miss* ajout_queue(t_miss*ancre,t_miss*maillon)
    {
    /*Même code*/
    return ancre}
    Et on l'appelle comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ancre=ajout_queue(ancre,missile);
    Enfin, vu que tu ne donnes pas le code de create_maillon, il est difficile de vérifier si le problème pourrait venir de là...

    Jc

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 39
    Par défaut
    Merci beaucoup pour cette aide qui m'a aidé, sinon il y avait une autre erreur dans le main :s

    ancre=(t_miss*)malloc(sizeof(t_miss));
    Ce qui faisait en fait tout planter

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/10/2005, 19h20
  2. Liste chaînée
    Par kilinette dans le forum C
    Réponses: 6
    Dernier message: 17/10/2005, 23h45
  3. Listes chaînées circulaires
    Par gege2061 dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 11/05/2005, 13h44
  4. Construction de liste chaînées
    Par fomblardo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 15/03/2005, 21h19
  5. Insertion d'un noeud dans une liste chaînée
    Par habib106 dans le forum Assembleur
    Réponses: 8
    Dernier message: 07/04/2004, 22h34

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