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

  FORUM HardWare.fr
  Programmation
  C

  Fonction tri qui plante mon code

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fonction tri qui plante mon code

n°983258
nolimites
Z'avez pas vu Mirza?
Posté le 16-02-2005 à 10:56:36  profilanswer
 

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
mood
Publicité
Posté le 16-02-2005 à 10:56:36  profilanswer
 

n°983270
chrisbk
-
Posté le 16-02-2005 à 11:05:57  profilanswer
 

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

n°983295
nolimites
Z'avez pas vu Mirza?
Posté le 16-02-2005 à 11:21:01  profilanswer
 

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: )

n°983314
skeye
Posté le 16-02-2005 à 11:32:29  profilanswer
 

man malloc.


---------------
Can't buy what I want because it's free -
n°983317
nolimites
Z'avez pas vu Mirza?
Posté le 16-02-2005 à 11:34:17  profilanswer
 

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?

n°983487
nolimites
Z'avez pas vu Mirza?
Posté le 16-02-2005 à 13:37:21  profilanswer
 

up  :cry:

n°983496
Vinx
Posté le 16-02-2005 à 13:45:44  profilanswer
 

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
n°983547
nolimites
Z'avez pas vu Mirza?
Posté le 16-02-2005 à 14:37:56  profilanswer
 

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 '

n°983548
nolimites
Z'avez pas vu Mirza?
Posté le 16-02-2005 à 14:38:15  profilanswer
 

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:

n°983552
chrisbk
-
Posté le 16-02-2005 à 14:48:06  profilanswer
 

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

mood
Publicité
Posté le 16-02-2005 à 14:48:06  profilanswer
 

n°983593
nolimites
Z'avez pas vu Mirza?
Posté le 16-02-2005 à 15:09:05  profilanswer
 

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???  :??:

n°983600
chrisbk
-
Posté le 16-02-2005 à 15:13:59  profilanswer
 

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
 

n°983635
nolimites
Z'avez pas vu Mirza?
Posté le 16-02-2005 à 15:26:07  profilanswer
 

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 :)
 

n°983638
nolimites
Z'avez pas vu Mirza?
Posté le 16-02-2005 à 15:27:51  profilanswer
 

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 :)

n°983639
chrisbk
-
Posté le 16-02-2005 à 15:27:59  profilanswer
 

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

n°983640
nolimites
Z'avez pas vu Mirza?
Posté le 16-02-2005 à 15:28:28  profilanswer
 

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 :)

n°983643
chrisbk
-
Posté le 16-02-2005 à 15:30:00  profilanswer
 

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)

n°983646
nolimites
Z'avez pas vu Mirza?
Posté le 16-02-2005 à 15:32:00  profilanswer
 

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:

n°983650
chrisbk
-
Posté le 16-02-2005 à 15:34:38  profilanswer
 

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)
 

n°990848
nolimites
Z'avez pas vu Mirza?
Posté le 23-02-2005 à 10:20:32  profilanswer
 

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


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

  Fonction tri qui plante mon code

 

Sujets relatifs
Peut etre simple si une fonction existefonction javascript pour ouvrir un explorer de fichier
Empecher dream weaver de modifier l'indentation du code ?[J2ME] probleme de code réseau
Multi-CSS, code PHP pour en changer, et le conserverCode anti-popup
Création de macro pour utliser du code vbutiliser fonction mail() chez free
Partage du code source entre développeur.recherche d'une fonction php
Plus de sujets relatifs à : Fonction tri qui plante mon code


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