Fonction tri qui plante mon code

Fonction tri qui plante mon code - C - Programmation

Marsh Posté le 16-02-2005 à 10:56:36    

Bonjour,
 
j'ai un problème avec mon programme. Je vous explique son but. Je dois rentrer quelques fiches via une structure, les afficher (jusque là tout va bien), puis je dois trier ces fiches via un vecteur d'index (par la méthode du tri par insertion) et les afficher dans l'ordre alpabétique. Mon programme plante lors de l'affichage des fiches triées (il plante peut être au niveau du tri). Pourriez vous donc me dire ce qui ne va pas  :??:  
 
Je joins ici le code et les warning que me renvois visual c++
 
Merci d'avance :)
 

Code :
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<conio.h>
  4. #include<string.h>
  5. void affichage(int, struct FICHE *);
  6. void encodage(int, struct FICHE *);
  7. void indexation(int, struct FICHE *, struct INDEX *);
  8. void tri(int, struct INDEX *);
  9. void affichage_index(int, struct FICHE *, struct INDEX *);
  10. struct FICHE
  11. {
  12. char nom[20];
  13. int age;
  14. char info[50];
  15. };
  16. struct INDEX
  17. {
  18. char nom[20];
  19. int indice;
  20. };
  21. void encodage(int nbre_elem, struct FICHE *pt)
  22. {
  23. int i,j=0;
  24. for(i=0;i<nbre_elem;i++)
  25. {
  26.  printf("------Fiche numero %d-----",i+1);
  27.  printf ("\n\nVeuillez saisir le nom: " );
  28.  fflush(stdin);
  29.  gets(pt->nom);
  30.  printf ("\nVeuillez l'age: " );
  31.  fflush(stdin);
  32.  scanf ("%d",&pt->age);
  33.  printf ("\nVeuillez saisir l'info: " );
  34.  fflush(stdin);
  35.  gets(pt->info);
  36.  pt++;
  37. }
  38. }
  39. void affichage(int nbre_elem, struct FICHE *pt)
  40. {
  41. int i;
  42. for(i=0;i<nbre_elem;i++)
  43. {
  44.  printf("------Fiche numero %d-----",i+1);
  45.  printf ("\nnom: " );
  46.  puts (pt->nom);
  47.  printf ("age: %d",pt->age);
  48.  printf ("\ninfo: " );
  49.  puts (pt->info);
  50.  pt++;
  51. }
  52. }
  53. void indexation(int nbre_elem, struct FICHE *pt, struct INDEX *pt2)
  54. {
  55. int i;
  56. for(i=0;i<nbre_elem;i++)
  57. {
  58.  strcpy (pt2->nom,pt->nom);
  59.  pt2->indice = i;
  60.  pt++;
  61.  pt2++;
  62. }
  63. }
  64. void tri(int nbre_elem, struct INDEX *pt2)
  65. {
  66. int i,j,test,inser2;
  67. char inser[20];
  68. i=1;
  69. while(i<nbre_elem)
  70. {
  71.  //inser = pt2+i;
  72.  strcpy (inser,(pt2+i)->nom);
  73.  inser2 = (pt2+i)->indice;
  74.  j = i-1;
  75.  test = strcmp(inser,(pt2+j)->nom);
  76.  //while (inser < pt2+j && j>= 0)
  77.  while (test < 0 && j>= 0)
  78.  {
  79.   strcpy ((pt2+(j+1))->nom,(pt2+j)->nom);
  80.   (pt2+(j+1))->indice = (pt2+j)->indice;
  81.   j = j-1;
  82.  }
  83.  strcpy ((pt2+(j+1))->nom,inser);
  84.  (pt2+(j+1))->indice = inser2;
  85.  i++;
  86. }
  87. }
  88. void affichage_index(int nbre_elem, struct FICHE *pt, struct INDEX *pt2)
  89. {
  90. int i,j;
  91. for(i=0;i<nbre_elem;i++)
  92. {
  93.  j = (pt2+i)->indice;
  94.  printf("------Fiche triee numero %d-----",i+1);
  95.  printf ("\nnom: " );
  96.  puts ((pt+j)->nom);
  97.  printf ("age: %d",(pt+j)->age);
  98.  printf ("\ninfo: " );
  99.  puts ((pt+j)->info);
  100.  printf ("\nindice de tri: %d",pt2->indice);
  101. }
  102. }
  103. void main()
  104. {
  105. struct FICHE tab[50], * pt;
  106. struct INDEX tab2[50], * pt2;
  107. int nbre_elem;
  108. pt = &tab[0];
  109. pt2 = &tab2[0];
  110. printf ("Combien de fiches voulez vous encoder? : " );
  111. scanf ("%d", &nbre_elem);
  112. encodage(nbre_elem,pt);
  113. affichage(nbre_elem,pt);
  114. indexation(nbre_elem,pt,pt2);
  115. tri(nbre_elem,pt2);
  116. affichage_index(nbre_elem,pt,pt2);
  117. }


 

Code :
  1. --------------------Configuration: lc40_hfr - Win32 Debug--------------------
  2. Compiling...
  3. lc40_hfr.c
  4. c:\documents and settings\arnaud\bureau\nouveau dossier\lc40_hfr.c(98) : warning C4047: 'function' : 'char *' differs in levels of indirection from 'char '
  5. c:\documents and settings\arnaud\bureau\nouveau dossier\lc40_hfr.c(98) : warning C4024: 'strcpy' : different types for formal and actual parameter 1
  6. c:\documents and settings\arnaud\bureau\nouveau dossier\lc40_hfr.c(102) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char '
  7. c:\documents and settings\arnaud\bureau\nouveau dossier\lc40_hfr.c(102) : warning C4024: 'strcmp' : different types for formal and actual parameter 1
  8. c:\documents and settings\arnaud\bureau\nouveau dossier\lc40_hfr.c(112) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char '
  9. c:\documents and settings\arnaud\bureau\nouveau dossier\lc40_hfr.c(112) : warning C4024: 'strcpy' : different types for formal and actual parameter 2
  10. c:\documents and settings\arnaud\bureau\nouveau dossier\lc40_hfr.c(124) : warning C4047: '=' : 'struct FICHE *' differs in levels of indirection from 'int '
  11. c:\documents and settings\arnaud\bureau\nouveau dossier\lc40_hfr.c(98) : warning C4700: local variable 'inser' used without having been initialized
  12. lc40_hfr.obj - 0 error(s), 8 warning(s)


Message édité par nolimites le 16-02-2005 à 15:27:06
Reply

Marsh Posté le 16-02-2005 à 10:56:36   

Reply

Marsh Posté le 16-02-2005 à 11:05:57    

les warnings c pas juste pour faire beau :o
 
ton strcpy (inser,(pt2+i)->nom); est completement foireux. Le premier parametre doit etre un char * (c'est ce que le compilo essayait en vain de te dire). Et non il suffira pas juste de changer 'inser' en 'char *' a la place de 'char', il te faudra aussi allouer la zone mémoire qui va derriere

Reply

Marsh Posté le 16-02-2005 à 11:21:01    

chrisbk a écrit :

les warnings c pas juste pour faire beau :o
 
ton strcpy (inser,(pt2+i)->nom); est completement foireux. Le premier parametre doit etre un char * (c'est ce que le compilo essayait en vain de te dire). Et non il suffira pas juste de changer 'inser' en 'char *' a la place de 'char', il te faudra aussi allouer la zone mémoire qui va derriere


 
euh dans la pratique on fait comment  :??: (pas tapé hein noob inside  :cry: )

Reply

Marsh Posté le 16-02-2005 à 11:32:29    

man malloc.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-02-2005 à 11:34:17    

ben les malloc on commence seulement à les voir et ici on doit pas les utiliser. Mais si je transforme mon inser en vecteur ca ira pas mieux?

Reply

Marsh Posté le 16-02-2005 à 13:37:21    

up  :cry:

Reply

Marsh Posté le 16-02-2005 à 13:45:44    

Et un char inser[20] par exemple ? ;)
(20 a l'air de suffire vu que tu y copies le membre "nom" qui est aussi un char[20])


Message édité par Vinx le 16-02-2005 à 13:46:59
Reply

Marsh Posté le 16-02-2005 à 14:37:56    

Vinx a écrit :

Et un char inser[20] par exemple ? ;)
(20 a l'air de suffire vu que tu y copies le membre "nom" qui est aussi un char[20])


 
 
j'ai plus que 1 warning mais ca plante tjrs au même endroit :(
 
C:\Documents and Settings\Arnaud\Bureau\Nouveau dossier\lc40_hfr.c(124) : warning C4047: '=' : 'struct FICHE *' differs in levels of indirection from 'int '

Reply

Marsh Posté le 16-02-2005 à 14:38:15    

nolimites a écrit :

j'ai plus que 1 warning mais ca plante tjrs au même endroit :(
 
C:\Documents and Settings\Arnaud\Bureau\Nouveau dossier\lc40_hfr.c(124) : warning C4047: '=' : 'struct FICHE *' differs in levels of indirection from 'int '


 
 :cry:  :cry:  :cry:

Reply

Marsh Posté le 16-02-2005 à 14:48:06    

mais t'as toujours pas compris que tu ne pouais pas mettre qqchose de type 'struct FICHE *' dans une variable de type 'int' ??

Reply

Marsh Posté le 16-02-2005 à 14:48:06   

Reply

Marsh Posté le 16-02-2005 à 15:09:05    

chrisbk a écrit :

mais t'as toujours pas compris que tu ne pouais pas mettre qqchose de type 'struct FICHE *' dans une variable de type 'int' ??


et je fais quoi comme modif alors???  :??:

Reply

Marsh Posté le 16-02-2005 à 15:13:59    

je veux comprendre comment tu raisonnes :
 
124: pt = (pt2+i)->indice;
 
1/ quel est le type de (pt2+i)->indice ?
2/ quel est le type de pt ?
3/ la conversion entre les deux types est elle possible ?
4/ si non, que faire pour qu'elle le devienne
 

Reply

Marsh Posté le 16-02-2005 à 15:26:07    

merci les gars comme d'hab je lis pas les warning et forcement ca va pas  :pfff:  
 
je viens de corriger et la ca roule impec :)
 
Merci bcp :)
 

Reply

Marsh Posté le 16-02-2005 à 15:27:51    

chrisbk a écrit :

je veux comprendre comment tu raisonnes :
 
124: pt = (pt2+i)->indice;
 
1/ quel est le type de (pt2+i)->indice ?
2/ quel est le type de pt ?
3/ la conversion entre les deux types est elle possible ?
4/ si non, que faire pour qu'elle le devienne


 
 
je viens de mettre à jour mon code avec la derniere version qui marche bien. J'ai remplace le pt par un bête int j et ca roule :)

Reply

Marsh Posté le 16-02-2005 à 15:27:59    

on peut voir la version corrigée stp ? [:joce]

Reply

Marsh Posté le 16-02-2005 à 15:28:28    

chrisbk a écrit :

on peut voir la version corrigée stp ? [:joce]


 
 
on se croise ds les replys mais suffit de relire le code tt est la :)

Reply

Marsh Posté le 16-02-2005 à 15:30:00    

ah ouais.  
Bon petit truc pour améliorer la lisibilité :
 
(pt+j)->indice  
 
peut s'ecrire aussi  
 
pt[j].indice
 
ce qui est generalement plus clair (surtout quand tu commences a empiler les pointeurs)

Reply

Marsh Posté le 16-02-2005 à 15:32:00    

chrisbk a écrit :

ah ouais.  
Bon petit truc pour améliorer la lisibilité :
 
(pt+j)->indice  
 
peut s'ecrire aussi  
 
pt[j].indice
 
ce qui est generalement plus clair (surtout quand tu commences a empiler les pointeurs)


 
merci du conseil mais justement mon prof ne veut que des pointeurs et ne veut pas voir la forme tab[i] etc... Il veut que des pt,pt2,... Ca s'appelle le drill qu'il dit  :ange:

Reply

Marsh Posté le 16-02-2005 à 15:34:38    

nolimites a écrit :

merci du conseil mais justement mon prof ne veut que des pointeurs et ne veut pas voir la forme tab[i] etc... Il veut que des pt,pt2,... Ca s'appelle le drill qu'il dit  :ange:


 
bondieu, t'as hérité de quoi encore ? [:el g]
(enfin bon, ca vous apprends un peu l'arithmetique sur pointeur)
 

Reply

Marsh Posté le 23-02-2005 à 10:20:32    

chrisbk a écrit :

bondieu, t'as hérité de quoi encore ? [:el g]
(enfin bon, ca vous apprends un peu l'arithmetique sur pointeur)


 
 
pas facile le prof hein :d
 
sinon tu veux bien jeter un oeil la dessus ;)
 
merci :)
 
http://forum.hardware.fr/hardwaref [...] 4893-1.htm

Reply

Sujets relatifs:

Leave a Replay

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