Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1072 connectés 

  FORUM HardWare.fr
  Programmation
  C

  warnings: listes chainée [résolu]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

warnings: listes chainée [résolu]

n°1526040
bad___day
Posté le 08-03-2007 à 20:39:27  profilanswer
 

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
mood
Publicité
Posté le 08-03-2007 à 20:39:27  profilanswer
 

n°1526063
Ace17
Posté le 08-03-2007 à 21:51:03  profilanswer
 

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" ;)

n°1526134
Tamahome
⭐⭐⭐⭐⭐
Posté le 09-03-2007 à 08:55:30  profilanswer
 

et Fusion c'est Merge :o

n°1526525
bad___day
Posté le 09-03-2007 à 16:47:18  profilanswer
 

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 !
 

n°1526581
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-03-2007 à 18:38:28  profilanswer
 

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/
n°1526906
Sve@r
Posté le 10-03-2007 à 20:15:19  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  warnings: listes chainée [résolu]

 

Sujets relatifs
[Batch] Comment lire la 7e ligne d'un fichier ? [Résolu][Résolu] Connexion à une base de données mySQL via ODBC
[résolu] C++: double : limitation à 15 digits - comment aller au dela?passage d'une fonction comme argument pour une autre fonction (Résolu)
[RESOLU] [SQL] Utilisation de champs dans un case CASE[resolu][php/html] recevoir les info d'un formulaire par mail
[Résolu] Envoi d'un mail en PHP[résolu] array_unique() pour tableaux multidimensionnels
[résolu] Compter le nombre d'entrées de plusieurs tables[Résolu]Liste déroulante dynamique qui ne s'affiche pas
Plus de sujets relatifs à : warnings: listes chainée [résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR