programme qui marche puis qui ne marche plus ??

programme qui marche puis qui ne marche plus ?? - C - Programmation

Marsh Posté le 09-05-2010 à 13:55:15    

Bonjour,
 
je ne comprend pas, hier mon programme marchait très bien sous code blocks et aujourd'hui rien à faire quand je clique sur la touche 1 pour trier dans l'ordre croissant, le programme plante.
 
Quelqu'un sait pourquoi s'il vous plait ?
 

Message cité 1 fois
Message édité par popit le 12-05-2010 à 01:17:37
Reply

Marsh Posté le 09-05-2010 à 13:55:15   

Reply

Marsh Posté le 09-05-2010 à 16:55:18    

Code :
  1. int  type_order()
  2. {
  3.   char  buf[0];
  4.   ...
  5.   read(0, buf, 2)


  Si on lit deux caractères, ça devrait être char  buf[2]; sinon, on écrit ou il ne faut pas, et l'OS n'aime pas...
Ça fait la deuxième fois de la semaine que je vois passer cette erreur.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-05-2010 à 21:31:36    

popit a écrit :

Bonjour,
 
je ne comprend pas, hier mon programme marchait très bien sous code blocks et aujourd'hui rien à faire quand je clique sur la touche 1 pour trier dans l'ordre croissant, le programme plante.


Cas typique d'un comportement indéterminé. T'as écrit un truc hors norme et Gilou a trouvé que c'était d'écrire 2 caractères dans une zone prévue pour n'en recevoir aucun (???) et donc le programme entre dans une phase où son résultat n'est plus garanti. Il peut marcher, il peut planter, il peut marcher pendant 10 ans et planter la 11° année, il peut marcher les jours pairs ou les mois impairs, brefs personne ne peut dire ce qu'il fera...


Message édité par Sve@r le 09-05-2010 à 21:32:43

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

Marsh Posté le 10-05-2010 à 19:23:38    

gilou a écrit :

char buf[0];


 
Ca fait quoi ?  
Un tableau de 0 char ?
Un char ?  
 :??:  

Reply

Marsh Posté le 10-05-2010 à 20:25:47    

Bonjour, j'ai changé l'erreur mais çà n'a en rien réussi a faire marcher le programme.
 
je l'ai modifié un petit peu j'obtiens :
 
 
 
 
Je rentre ma série de valeur puis au moment de taper 1 ou 2 pour ranger dans l'ordre croissant ou décroissant le programme plante .. Quelqu'un sait pourquoi svp ?


Message édité par popit le 12-05-2010 à 01:17:59
Reply

Marsh Posté le 10-05-2010 à 20:39:30    

Bonjour, j'ai un autre problème car je suis sur un autre programme qui commence comme ceci :
 
 
 
 
 
Dans le cas où on tape un autre chiffre que un ou deux le programme me demande si je veux recommencer mais si je met une lettre il bug complètement. Je fais comment pour pas que çà arrive et pour recommencer le programme svp :)

Message cité 2 fois
Message édité par popit le 12-05-2010 à 01:18:12
Reply

Marsh Posté le 10-05-2010 à 20:46:24    

404 Not Found a écrit :


 
Ca fait quoi ?  
Un tableau de 0 char ?
Un char ?  
 :??:  


Oui c'est quoi, je ne me suis jamais demandé? un scalaire?

Reply

Marsh Posté le 10-05-2010 à 21:26:40    

404 Not Found a écrit :


 
Ca fait quoi ?  
Un tableau de 0 char ?
Un char ?  
 :??:  

Ben oui, ça fait un tableau de 0 char.
Y'a eu apparemment une époque ou c'était une astuce pour indiquer au compilo qu'on allait avoir un tableau dont la taille ne serait connue qu'a l'exécution, mais c'est inutile avec les extensions C99.
char toto[0], le voir deux fois en une semaine chez des débutants, ça me laisse penser qu'il y a un tutoriel pourri avec ça dedans quelque part sur le net.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-05-2010 à 21:29:12    

popit a écrit :

Bonjour, j'ai un autre problème car je suis sur un autre programme qui commence comme ceci :
 

Code :
  1. int main()
  2. {
  3.   int recommencer=1;
  4.   do
  5.   {
  6.     int nombre;                             //nombre decimal rentre
  7.     int i=7, bin[8]={0};
  8.     int j=0;
  9.     int conv;                               //type de convertion
  10.     int dec=0;
  11.     float puis;                             //puissance de 10
  12.     int X=7;                                //valeur du nombre de bits
  13.     float valeur;                           //nombre binaire rentre
  14.     int a;
  15.     int b=0, tab[8]={0};
  16.     int d=7;
  17.     int e=0;
  18.     char lettre;
  19.     int nb;
  20.     int f;
  21.     char salut;
  22.     printf("\n\n" );
  23.     printf("\tConversion Decimal-Binaire --> tapez 1 \n\tConversion Binaire-Decimal --> tapez 2 \t\t --> " );
  24.     scanf("%d",&conv);
  25.     printf("\n\n\n" );


 
 
 
Dans le cas où on tape un autre chiffre que un ou deux le programme me demande si je veux recommencer mais si je met une lettre il bug complètement. Je fais comment pour pas que çà arrive et pour recommencer le programme svp :)
 

Tu poste tout le code de la fonction, et pas un bout incomplet (on n'a même pas le test du while) sinon, comme on n'a pas des boules de cristal infaillibles, on pourra pas te répondre.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-05-2010 à 21:46:43    

^^ ok ok je te passe tout le programme alors mais l'important c'est çà, si on tape une lettre faut pas que çà plante tout ..
 
Je passe pas tout le programme sait on jamais si un des élèves passe sur le site et me vole mon projet qui ai terminer mis a part çà.
 
Y'a pas une technique simple a utiliser par hasard ?
 

Reply

Marsh Posté le 10-05-2010 à 21:46:43   

Reply

Marsh Posté le 10-05-2010 à 21:50:40    

Pas tout le programme, mais la fonction complete, ou au moins toute la boucle do...while.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-05-2010 à 23:06:37    

La boucle do while c'est pour tout le programme pour le recommencer ^^

Reply

Marsh Posté le 10-05-2010 à 23:30:01    

Bon sinon, tu as un pb de conception ici:

Code :
  1. int *make_int_tab(char **tab, int *nb)
  2. {
  3.   int  i;
  4.   i = 0;
  5.   while (tab[i])
  6.     {
  7.       nb[i] = atoi(tab[i]);
  8.       i++;
  9.     }
  10.   return (nb);
  11. }


Comme ton nb est un tableau d'entiers (donc avec une taille fixée comme étant le nombre de chaines de tab +2), une fois que tab[i] vaut null, on arrête, donc on remplit pas les deux derniers éléments de nb[i] ce qui fait qu'il est rempli par des valeurs aléatoires, ce qui est pas génial...
Déja, si tu fais
nb = xmalloc(len * sizeof(*nb));
c'est beaucoup mieux
Ensuite,
dans quicksort_in (j'ai pas testé l'autre) tu testes pas si pivot vaut 0, ce qui fait que a un moment, pivot vaut 0, et idx s'incrémente bien au delà de ce qu'il faut
en faisant
while ((check_order(nb) == FAILURE) && (pivot))
c'est beaucoup mieux  (je garantis pas que ça soit parfait pour l'algo de tri, mais sur les essais que j'ai fait, ça fonctionnait. A toi d'améliorer s'il y a lieu)
Enfin
void  aff_nb(int *nb)
n'est pas bonne, car on a un tableau donc on doit s'arrêter quand on a atteint l'index max et pas en testant si un élément vaut 0 comme tu fais [tu a confondu tableau et liste chainée on dirait].
void  aff_nb(int *nb, int max)
....
{
  int  i;

 

 i = 0;
  while (i <= max)
    {
      printf("-->  %d\n", nb[i]);
      i++;
    }
}
avec un appel
aff_nb(nb, len - 1);
ca colle beaucoup mieux (j'ai testé pour des séries de 5 nb dont des négatifs et ça marchait)

 

Bon, sinon, quelques remarques:
dans main():
  printf("Veuillez entrer les nombres souhaitees\n" );
  memset(buf, '\0', 2048);
  fgets(buf, 2048, stdin);
fgets est plus portable que read, et évite l'inclusion de #include <unistd.h>
Rien qu'avec ce petit changement, j'ai pu tester sous windows et trouver les bugs de ton programme.

 

Autres détails: sous windows, le compilo aime vraiment pas qu'on utilise des valeurs pas initialisées (il doit y avoir un flag pour régler cela, mais bon...)
en faisant dans ton code
  char  **tab=NULL;  (dans main)
et
  buf[0] = 'z';
  while (buf[0] != 'q')  (dans dichotomi)
le compilo est content...

 

Bon globalement, c'est pas mal, ce code, ca fonctionnait presque, il va juste falloir faire attention a comprendre que quand on alloue un tableau dynamique en C, c'est un tableau (et donc que les tests de pointeur nuls sur les éléments du tableau ça n'a pas grand sens, sauf quand c'est un tableau de pointeurs)

 

A+,


Message édité par gilou le 10-05-2010 à 23:32:46

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 11-05-2010 à 10:44:27    

popit a écrit :

Bonjour, j'ai un autre problème car je suis sur un autre programme qui commence comme ceci :

 
Code :
  1. int main()
  2. {
  3.   int recommencer=1;
  4.   do
  5.   {
  6.     int nombre;                             //nombre decimal rentre
  7.     int i=7, bin[8]={0};
  8.     int j=0;
  9.     int conv;                               //type de convertion
  10.     int dec=0;
  11.     float puis;                             //puissance de 10
  12.     int X=7;                                //valeur du nombre de bits
  13.     float valeur;                           //nombre binaire rentre
  14.     int a;
  15.     int b=0, tab[8]={0};
  16.     int d=7;
  17.     int e=0;
  18.     char lettre;
  19.     int nb;
  20.     int f;
  21.     char salut;
  22.     printf("\n\n" );
  23.     printf("\tConversion Decimal-Binaire --> tapez 1 \n\tConversion Binaire-Decimal --> tapez 2 \t\t --> " );
  24.     scanf("%d",&conv);
  25.     printf("\n\n\n" );
  

Dans le cas où on tape un autre chiffre que un ou deux le programme me demande si je veux recommencer mais si je met une lettre il bug complètement. Je fais comment pour pas que çà arrive et pour recommencer le programme svp :)

 


Quand on a un dialogue console avec l'utilisateur, utiliser scanf, c'est se tirer une balle dans le pied, car scanf suppose l'utilisateur comme parfait, ne soumettant pas d'input invalide.
La technique usuelle:
1) tu récupère l'input utilisateur dans un buffer, avec fgets
2) tu analyses cet input, et prends les décisions appropriées.
A+,


Message édité par gilou le 11-05-2010 à 10:45:05

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 11-05-2010 à 20:55:01    

Merci Gilou, merci beaucoup pour ce que tu dis mis sachant que je fais de l'info depuis a peine 1 mois j'ai pas mal de mal a comprendre ^^
 
Concernant le quicksort :
 
 
Quand dans int *make_int_tab(char **tab, int *nb)  
tu me dis de mettre nb = xmalloc(len * sizeof(*nb));  je sais pas où le placer parce qu'en fait je comprend même pas ce que çà veut dire ..
 
Dans void  aff_nb(int *nb, int max)
tu me dis de faire un appel je comprend pas non plus =)
 
Quand tu me dis que " le compilo aime vraiment pas qu'on utilise des valeurs pas initialisées " Je dois changer comment ce que tu me dis stp ^^
 
 
 
 
Concernant l'autre programme :  
 
 
j'abandonne pour le fait de taper 1 lettre ^^ Etant donner qu'on a rien appris de ce que tu me dis en cours je vais passer mais merci beaucoup du renseignement =)
 
 
 

Reply

Marsh Posté le 11-05-2010 à 21:29:41    

Pour nb = xmalloc(len * sizeof(*nb)): tu fais nb = xmalloc((len + 2) * sizeof(*nb)) faudra m'expliquer d'ou sort le +2.

 

Quand je te dis de faire l'appel aff_nb(nb, len - 1) c'est a la place de ton appel aff_nb(nb).

 

A+,


Message édité par gilou le 11-05-2010 à 21:30:45

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 11-05-2010 à 21:46:14    

Je viens de faire ce que tu m'as dis, le programme ne plante plus, c'est déjà très bien =)
 
Mais, oui car il y a souvent un mais, quand je clique sur 1 pour trier il ne m'affiche pas le tableau mais directement " quel chiffre recherchez vous ? "
 
WHY ?!

Reply

Marsh Posté le 11-05-2010 à 23:00:43    

Faudrait peut etre bosser un peu par vous même, je vous ai donné suffisamment d'indications pour faire marcher ce programme.
Suivre le déroulement d'un programme en mettant des points d'arret au débugger et en suivant l'execution pas a pas, il faut apprendre a le faire.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 12-05-2010 à 01:19:01    

Merci beaucoup Gilou, après 2 heures a chercher la petite bête et a rajouter des erreurs j'ai trouvé et tout fonctionne très bien.
 
Maintenant, dodo ^^

Reply

Sujets relatifs:

Leave a Replay

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