[C] Débutant: je trouve pas les erreurs !!

Débutant: je trouve pas les erreurs !! [C] - C++ - Programmation

Marsh Posté le 20-10-2002 à 18:04:23    

Salut!
Etant débutant en C, je n'arrive pas à comprendre où se situent les erreurs dans ce petit programme.
Il s'agissait de rédiger un programme qui tri les valeurs d'un tableau par ordre croissant.
 
 
-----------------------------------------------------------------

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //saisie du tableau
  4. void saisir_tableau(int tab[],int nbentiers)
  5. {
  6. int i;
  7. int entier;
  8. i=0;
  9. printf("Combien d'entiers? (2 minimum) \n" );
  10. scanf("%i",&nbentiers);
  11. while(nbentiers<2)
  12. {
  13. printf("Erreur ! Combien d'entiers? (2 minimum) \n" );
  14. scanf("%i",&nbentiers);
  15. }
  16. tab=(int *) malloc (nbentiers * sizeof(int) );
  17. for(i=0;i<nbentiers;i++)
  18. {
  19. printf("Entrez la %ie valeur du tableau: ",i+1);
  20. scanf("%i",&tab[i]);
  21. }
  22. }
  23. //affichage tableau
  24. void affiche_tableau(int tab[],int nbentiers)
  25. {
  26. int i;
  27. int entier;
  28. entier=0;
  29. i=0;
  30. while(i<=nbentiers)
  31. {
  32. printf("%i \n",tab[i]);
  33. i++;
  34. }
  35. }
  36. //tri
  37. void tri_bulles(int tab[],int nbentiers) 
  38. {
  39. int i,j,min,aux;
  40. int perm;
  41. aux=0;
  42. i=0;
  43. j=2;
  44. min=j;
  45. perm=1;
  46. while(perm=1)
  47. {
  48. min=j;
  49. perm=0;
  50. for(i=nbentiers;i>=min;i--)
  51.  {
  52.  if (tab[i]<tab[i-1])
  53.   {
  54.   aux=tab[i];
  55.   tab[i]=tab[i-1];
  56.   tab[i-1]=aux;
  57.   j=i;
  58.   perm=1;
  59.   }
  60.  }
  61. }
  62. }
  63. //fonction principale
  64. main()
  65. {
  66. int nbentiers;
  67. int *tab;
  68. nbentiers=0;
  69. tab=0;
  70. saisir_tableau(tab,nbentiers);
  71. affiche_tableau(tab,nbentiers);
  72. tri_bulles(tab,nbentiers);
  73. affiche_tableau(tab,nbentiers);
  74. free(tab);
  75. }


-----------------------------------------------------------------
 
Donc si vous pouviez m'aider ce serait sympa, ca fait déjà 2h que je bloque.
 
Merci d'avance.


Message édité par *LighTninG* le 20-10-2002 à 18:08:43
Reply

Marsh Posté le 20-10-2002 à 18:04:23   

Reply

Marsh Posté le 20-10-2002 à 18:07:05    

c quoi le message d'erreur ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-10-2002 à 18:10:09    

Ben il compile bien le prog, il le lance, je peux saisir les valeurs dans le tableau mais au moment du tri il y a une erreur et le prog s'arrete

Reply

Marsh Posté le 20-10-2002 à 18:16:11    

la voila ton erreur :
 
int nbentiers;  
int *tab;  
     
nbentiers=0;  
tab=0;
 
 
tu donnes à un pointeur la valeur 0, et comme tu utilises ce pointeur dans ta fonction de tri à bulles, tu lis ou écris à cet emplacement mémoire, ce qui est interdit !
 
et en plus, ton tableau n'est meme pas initialisé, la mémoire n'est pas réservée, bref, c pas la joie !!


Message édité par Harkonnen le 20-10-2002 à 18:19:45

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-10-2002 à 18:29:38    

Ben oui Harkonnen c'est bien pour ca que je suis un débutant :)
 
Mais euh qu'est ce t'entend par initialiser le tableau? Reserver la memoire? Pourtant j'ai mis un malloc dans la fonction saisie ca suffit pas?
 
Sinon le debuggeur m'indique que ca merde au niveau du printf
je comprend tjs pas pkoi
 

Code :
  1. //affichage tableau  
  2.  
  3.   void affiche_tableau(int tab[],int nbentiers)
  4.   {
  5.     int i;
  6.     int entier;
  7.    
  8.     entier=0;
  9.     i=0; 
  10.    
  11.     while(i<=nbentiers)
  12.      {
  13.        printf("%i \n",tab[i]);
  14.        i++;
  15.      }
  16.   }


Message édité par *LighTninG* le 20-10-2002 à 18:30:24
Reply

Marsh Posté le 20-10-2002 à 18:36:20    

Ca merde au niveau du printf parce que tu demandes à lire une valeur qui se trouve à un emplacement mémoire interdit !
 
Vire déja le tab=0 dans le main.
 
Ensuite, toujours dans le main, réserve la mémoire nécessaire à ce tableau, avant la fonction saisir_tableau :
 
tab=(int *)calloc(nbentiers * sizeof(int) );
 
j'ai remplacé malloc par calloc pour initialiser ton tableau à 0
 
vire la ligne équivalente dans ta fonction saisir_tableau
 
ça devrait déja aller un peu mieux :)


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-10-2002 à 18:45:02    

t'aime pas les for ?


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 20-10-2002 à 19:00:38    

taz@ppc > Si si j'aime bien aussi les for :)
 
Bon merci harkonnen déjà c'est mieu en effet, mais ya encore des pbs: Au moment d'afficher le tableau avant le tri il n'affiche que la premiere valeur de celui ci et n'effectue pas la boucle  :??: J'ai essayé avec une boucle for et ca change rien.
 
Et d'ailleurs au niveau du tri j'ai l'impression que ca ne fonctionne pas non plus .


Message édité par *LighTninG* le 20-10-2002 à 19:01:37
Reply

Marsh Posté le 20-10-2002 à 19:12:31    

de toutes facon le tri par bulles c'est le plus nul  :o   :D


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 20-10-2002 à 19:31:04    

Ben peut etre mais c'est le boulot qu'on ma donné à faire donc y vaut mieu que je fasse comme on me l'a indiqué :)

Reply

Marsh Posté le 20-10-2002 à 19:31:04   

Reply

Marsh Posté le 20-10-2002 à 19:33:36    

si ton tableau fait nbentiers, alors
 
i=nbentiers; et tab[i] ca marche pas...


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 20-10-2002 à 19:51:39    

Code :
  1. while(perm=1)


 
Voila la grosse bourde classique ;)
 
C'est pas une comparaison, c'est une affectation
 

Reply

Marsh Posté le 20-10-2002 à 19:54:36    

comme koi ca peut servir de regarder ses warnings de compilation  :sarcastic:


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 20-10-2002 à 19:55:19    

Kristoph > Merci :)
 
Taz@PPC > Bah justement ya pas de warnings
 
Mais kk1 peut il m'expliquer pkoi il me fait pas cette boucle ?
Je sais je sais je suis franchement pas doué mais bon...


Message édité par *LighTninG* le 20-10-2002 à 19:55:57
Reply

Marsh Posté le 20-10-2002 à 19:56:37    

Lightning >> j'éspère quand même que t'as compris ce que je t'ai dit de faire et pourquoi il faut le faire ! Sinon ça sert à rien... :(


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-10-2002 à 19:57:15    

ben tu as décidé de parcourir le tableau de la fin vers le debut donc
 
fo(i=nbentiers-1; i!=0; --i)
{
  // ...
}


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 20-10-2002 à 20:00:06    

Oui harknonnen j'ai compris ce que tu ma dis de faire et la je  ne referais plus cette connerie :)

Reply

Sujets relatifs:

Leave a Replay

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