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 :

tri d'une liste simplement chainée erreur seg fault


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut tri d'une liste simplement chainée erreur seg fault
    Bonjour, dans mon jeu j'ai créer une liste simplement chainé qui contient les données des mes balles il y a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct dataImg dataImg;
     
    struct dataImg
    {
      int x, y; /*position dans la SDL */
      int vx, vy; /*vecteur vitesse*/
      int count;  /*un conteur qui dit quand la balle a été touché 4 fois elle disparait */
      char ScrPos;  /*L'écran est divisé en 4 partie, la valeur ScrPos vaut soit 0 1 2 3 en fonction de sa position dans une des4 partie de l'écran*/ 
      SDL_Rect ImgSpr; /*contient les coordonnées de l'image dans le sprite*/
      dataImg* next;
    };
    Ensuite j'ai une autre struct ou une des variables pointe sur la struct dataImg la voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct dataImageScr
    {
      dataImg* ball; /*C'est le pointeur qui pointe sur ma liste*/
      dataImg ship;
      dataImg shoot;
      dataImg flashShipL;
      dataImg flashShipR;
      int NbBallScr;
      int count0,count1,count2,count3;/*Nb ball in each of 4 section of screen */
    }dataImageScr;
    Donc voilà mon problème il ce situe au niveau du partage de l'écran je vous explique : j'ai une fonction qui récolte les positions de chaque balle a l'écran si une ball est dans le coin inférieur (je me base sur les origines de la SDL) droit je met PosScr à 0, si la balle est dans coin supérieur droit je mets 1 si on est dans le coin supérieur gauche je mets 2 et si je suis dans le coin inférieur gauche je mets 3.

    Et donc ensuite ce que je souhaite c'est comparé toutes les coordonnées des balles qui ont un ScrPos identique pour faire mes collisions.

    Et donc comme dans ma liste les ScrPos ne sont pas dans l'ordre je souhaitais trié ma liste dans l'ordre croissant avant de faire mes test de collisions et c'est la que l'on arrive au fond du problème c'est que j'ai un seg fault quand je fait mon tri.
    Pourriez-vous m'aider à trouver l'erreur ; dans mon code le problème ce situe quand je fait C=C->next
    car quand ensuite je fait mon if donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(C->ScrPos > C->next->ScrPos)
    dans C->next->ScrPos C->next vaut NULL alors que le tri n'est pas terminé comme si j'étais arrivé a la fin alors que je ne suis pas arrivé a la fin de ma liste.

    Pour mon tri je changes les adresses. J'utilise le tri a bulle qui est conseillé pour des tris de moins de 20 valeurs.

    Voici ma fonction de tri :

    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
    30
    31
    32
    33
    34
     
     
    void clash_sortBallSplitScr(dataImageScr* D)
    {
      dataImg* C=NULL;
      dataImg* F=NULL;
      int i,j;
      int nb=D->NbBallScr-1;
      int nb1=nb;
     
     for(j=0;j<nb;j++)
       {
          C=D->ball;
          F=D->ball;
     
          /*while(C->next!=NULL)*/
          for(i=0;i<nb1;i++)
    	{ 
    	  if(C->ScrPos>C->next->ScrPos) /*sa plante au niveau de C->next qui vaut NULL alors que la boucle n'a pas fini de s'exécuter*/
    	    {
    	      if(i==0)
    		D->ball=C->next; /*pour toujours garder l'adresse de la tête */
     
    	      F->next=C->next; 
    	      F=C->next;
    	      C->next=C->next->next;
    	      F->next=C;
    	      C=F;
    	    }
    	  C=C->next; /*l'erreur est ici et se matérialise au if*/
    	}
          nb1--;
        }
    }
    Sinon si je ne veut pas modifié les pointeurs de mes cellules je suis obligé de transférer toutes les donné de la cellule dans l'autre, en fonction de ScrPos ce que je trouve reloud je préfère changer la dispositions des cellules de ma liste.

    Ou bien de créer une autre liste et de copié dans celle-ci les donné de la cellule en mettant dans l'ordre croissant en me basant sur ScrPos.

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Je ne vais pas répondre directement à ta question car - ne le prend pas mal - j'ai l'impression que tu perds vraiment beaucoup de temps en conjectures et en premature optimization. C'est bien de t'intéresser aux techniques permettant d'améliorer l'efficacité d'un programme, encore faut-il que leur application soit pertinente.

    Tu dis qu'il n'y a qu'une vingtaine de valeurs dans ta liste et tu utilises pourtant un partitionnement, qui est une optimisation plutôt destinée à des collections de grande taille. Pourquoi ? Est-ce que tu as profilé ton code et identifié un ralentissement notable provenant de cette section de code ? Ton jeu est-il par ailleurs terminé ?

    À la longue, tu risques de te démotiver plus qu'autre chose. Je te conseille de t'en tenir à une approche naïve (ici, comparer simplement chaque balle à toutes les autres) jusqu'à obtenir un premier résultat. Si les performances ne sont pas satisfaisantes, tu auras bien le temps de t'en rendre compte et de t'en occuper ensuite.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut
    Non je ne le prends pas mal bien au contraire à partir du moment ou c'est constructif ; je te remercie de ton aide.

    Tu dis qu'il n'y a qu'une vingtaine de valeurs dans ta liste et tu utilises pourtant un partitionnement, qui est une optimisation plutôt destinée à des collections de grande taille. Pourquoi ?
    je voulais passer par les liste car il m'avait semblé que pour supprimer une balle c'était plus simple en détruisant la cellule que en écrasant le pointeur a supprimer d'un tableau de pointeur par la dernière valeur de ce tableau

    Est-ce que tu as profilé ton code et identifié un ralentissement notable provenant de cette section de code ? Ton jeu est-il par ailleurs terminé ?
    Profilé je ne vois pas ce que tu veux dire mais non mon jeu ne ralentie pas mon il est terminé (la version tableau) avec quelque petite imperfection (notament après la suppression d'une balle il garde une trace de la dernière position et je n'ai pas réussis a voir ou était le problème mais disparait a la frame suivante) et reste en constante évolution car je voudrais continuer a l'améliorer.

    Le partitionnement de l'écran en 4 je me suis dit que sa pouvais être pas mal a coder mais c'est vrai que avec des liste c'est moins évident.

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Une liste chaînée est tout à fait adaptée à ta solution, ce n'est pas cela qui est en cause. Le souci est que tu complexifies - à mon sens bien vainement - ton code en espérant l'optimiser sans te baser sur des faits.

    Renseigne-toi bien sur le profilage et les outils disponibles. Cela t'aidera à déterminer quelles parties de ton code méritent ton attention, et tu auras probablement quelques surprises.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut
    Ok merci pour ta réponse

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut
    Question quand on tri une liste par exemple par ordre alphabétique

    est-ce que c'est mieux de trié les cellule ou bien de trié en changeant juste les valeurs de ces cellules ?

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

Discussions similaires

  1. Insertion d'un élément dans une liste simplement chainée triée (croissante)
    Par vayouva dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 14/11/2014, 09h29
  2. Tri d'une pile avec liste simplement chainée
    Par thecabbages dans le forum C
    Réponses: 3
    Dernier message: 17/12/2009, 21h08
  3. petite erreur d'implémentation dans une liste simplement chaînée
    Par johnny3 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 26/10/2008, 16h57
  4. Réponses: 3
    Dernier message: 25/10/2006, 19h08

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