warnings: listes chainée [résolu]

warnings: listes chainée [résolu] - C - Programmation

Marsh Posté le 08-03-2007 à 20:39:27    

Salut,
j'ai essayer de faire un bout de programme qui construit deux listes chaînée (unidirectionnelle) de telle sorte que la liste chaînée soit trier à chaque fois que l'utilisateur rentre une valeur ( la valeur contenu dans le champ info d'un élément de la liste chainée).
et ensuite je fait une simple fusion des deux listes dans une autre liste.
 
tout marche normalement bien et tout (je n'ai pas essayer les cas spéciales),
le problème c'est qu'a la compilation, mon compilateur (gcc) me signle deux warning:

Citation :

Project   : Console application
Compiler  : GNU GCC Compiler (called directly)
Directory : C:\Documents and Settings\Simple plan\Bureau\liste ch essaye\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.c
main.c: In function `MakeTriedListe':
main.c:127: warning: 'q' might be used uninitialized in this function
main.c: In function `FusionListes':
main.c:56: warning: 'q' might be used uninitialized in this function
Linking console executable: C:\Documents and Settings\Simple plan\Bureau\liste ch essaye\console.exe
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 2 warnings


 
et je n'arrive pas à vraiment trouvé l'origine de ces warning.
 
 
voici tout le code source:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct element
  4. {
  5.     int info;
  6.     struct element *suit;
  7. }
  8. liste;
  9. liste* MakeTriedListe( int );
  10. void ShowInfosListe( liste* );
  11. liste* FusionListes( liste*, liste* );
  12. int main(void)
  13. {
  14.     liste *t, *t1, *t2;
  15.     int n1, n2;
  16.     printf("donnez le nombre d'element de la 1ere liste:\n" );
  17.     scanf("%d", &n1);
  18.     printf("donnez le nombre d'element de la 2eme liste:\n" );
  19.     scanf("%d", &n2);
  20.     t1 = MakeTriedListe(n1);
  21.     t2 = MakeTriedListe(n1);
  22.     t = FusionListes( t1, t2 );
  23.     printf("\n\nLa 1ere liste:\n" );
  24.     ShowInfosListe( t1 );
  25.     printf("\n\nLa 2eme liste:\n" );
  26.     ShowInfosListe( t2 );
  27.     printf("\n\nLa liste de fusion:\n" );
  28.     ShowInfosListe( t );
  29.     return 0;
  30. }
  31. void ShowInfosListe( liste *tete )
  32. {
  33.     liste *A;
  34.     for( A = tete;  A != NULL;  A = A->suit )
  35.         printf("%d ", A->info);
  36. }
  37. liste* FusionListes( liste *tet1, liste *tet2 )
  38. {
  39.     liste *q, *p1, *p2, *p, *tet = NULL;
  40.     p1 = tet1;
  41.     p2 = tet2;
  42.     while( p1 != NULL && p2 != NULL )
  43.     {
  44.         p = (liste*) malloc( sizeof(liste) );
  45.         /* prendre la plus petite info et la metre dans le champ info de p */
  46.         if( p1->info == p2->info )
  47.         {
  48.             p->info = p1->info;
  49.             p1 = p1->suit;
  50.             p2 = p2->suit;
  51.         }
  52.         else if( p1->info < p2->info )
  53.         {
  54.             p->info = p1->info;
  55.             p1 = p1->suit;
  56.         }
  57.         else
  58.         {
  59.             p->info = p2->info;
  60.             p2 = p2->suit;
  61.         }
  62.         /* MAJ du chainage */
  63.         if( tet == NULL )
  64.         {
  65.             tet = p;
  66.             q = p;
  67.         }
  68.         else
  69.         {
  70.             q->suit = p;
  71.             q = p;
  72.         }
  73.     }
  74.     /* des que l'une des deux listes se terminer, on continue à
  75.        fusioner le reste de la liste non terminer */
  76.     while( p1 != NULL ) // s'il reste des element de la 1ere liste
  77.     {
  78.         p = (liste*) malloc( sizeof(liste) );
  79.         p->info = p1->info;
  80.         q->suit = p;
  81.         q = p;
  82.     }
  83.     while( p2 != NULL ) // s'il reste des element de la 2eme liste
  84.     {
  85.         p = (liste*) malloc( sizeof(liste) );
  86.         p->info = p2->info;
  87.         q->suit = p;
  88.         q = p;
  89.     }
  90.     return tet;
  91. }
  92. liste* MakeTriedListe( int n )
  93. {
  94.     liste *p, *tete, *A, *q;
  95.     /* on crée la tete */
  96.     tete = (liste*) malloc( sizeof(liste) );
  97.     printf("donnez le 1er entier: " );
  98.     scanf("%d", &(tete->info));
  99.     tete->suit = NULL;
  100.     while( n!=1 )
  101.     {
  102.         n--; // on diminue le compteur de nombre d'elements
  103.         p = (liste*) malloc( sizeof(liste) );
  104.         printf("donnez un entier: " );
  105.         scanf("%d", &(p->info));
  106.         /* reperer la position de l'insertion de l'element */
  107.         for( A=tete; A!=NULL && p->info <= A->info; q=A, A=A->suit );
  108.         /* on inset avant l'element pointé par A */
  109.         if( A == tete )
  110.         {
  111.             p->suit = tete;
  112.             tete = p;
  113.         }
  114.         else
  115.         {
  116.             q->suit = p;
  117.             p->suit = A;
  118.         }
  119.     }
  120.     return tete;
  121. }


 
merci


Message édité par bad___day le 14-03-2007 à 16:00:54
Reply

Marsh Posté le 08-03-2007 à 20:39:27   

Reply

Marsh Posté le 08-03-2007 à 21:51:03    

Ca veut dire qu'il existe des chemins d'execution tels que tu lises la valeur d'une variable qui n'a pas ete initialisee...
Et au fait, "triee" en anglais, c'est "sorted" ;)

Reply

Marsh Posté le 09-03-2007 à 08:55:30    

et Fusion c'est Merge :o

Reply

Marsh Posté le 09-03-2007 à 16:47:18    

Ace17 a écrit :

Ca veut dire qu'il existe des chemins d'execution tels que tu lises la valeur d'une variable qui n'a pas ete initialisee...


Mais comment résoudre ça ?
ça n'influence pas sur l'exécution du prog aparement !
 

Reply

Marsh Posté le 09-03-2007 à 18:38:28    

bad___day a écrit :

Mais comment résoudre ça ?
ça n'influence pas sur l'exécution du prog aparement !


La façon barbare, c'est d'initialiser la variable avec une valeur étrange (si c'est un pointeur, (void*) -1, par exemple) et de voir quand ça pète...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 10-03-2007 à 20:15:19    

bad___day a écrit :

ça n'influence pas sur l'exécution du prog aparement !


Evidemment, conceptuellement ça peut pas planter. Même si la boucle "for" de la ligne 145 ne s'exécute pas parce que la condition sort immédiatement => t'auras "q" non initialisé mais tu ne passeras pas dans le "else" des lignes 157 car t'auras "A == tete". Mais ça, le compilo ne le voit pas d'où le warning (risque de plantage si tu passes dans le "else" ).
Bien que algorithmiquement parlant ça ne puisse pas planter, le compilo ne le voit pas (il faudrait qu'il analyse que tu mets "A=tete" en ligne 145 puis que pour ça plante il faudrait que "A" soit différent de "tete" et ce genre d'analyse est trop complexe pour lui)...
 

bad___day a écrit :

Mais comment résoudre ça ?


Comment résoudre le warning ? faut initialiser "q" de façon non ambigüe.


Message édité par Sve@r le 10-03-2007 à 20:19:04

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed