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

  FORUM HardWare.fr
  Programmation
  C

  programme qui marche puis qui ne marche plus ??

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

programme qui marche puis qui ne marche plus ??

n°1991548
popit
Posté le 09-05-2010 à 13:55:15  profilanswer
 

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
mood
Publicité
Posté le 09-05-2010 à 13:55:15  profilanswer
 

n°1991577
gilou
Modérateur
Modzilla
Posté le 09-05-2010 à 16:55:18  profilanswer
 

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é!  --
n°1991624
Sve@r
Posté le 09-05-2010 à 21:31:36  profilanswer
 

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.
n°1991950
404 Not Fo​und
Posté le 10-05-2010 à 19:23:38  profilanswer
 

gilou a écrit :

char buf[0];


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

n°1991972
popit
Posté le 10-05-2010 à 20:25:47  profilanswer
 

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
n°1991977
popit
Posté le 10-05-2010 à 20:39:30  profilanswer
 

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
n°1991979
GrosBocdel
Posté le 10-05-2010 à 20:46:24  profilanswer
 

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?

n°1991982
gilou
Modérateur
Modzilla
Posté le 10-05-2010 à 21:26:40  profilanswer
 

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é!  --
n°1991983
gilou
Modérateur
Modzilla
Posté le 10-05-2010 à 21:29:12  profilanswer
 

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é!  --
n°1991986
popit
Posté le 10-05-2010 à 21:46:43  profilanswer
 

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

mood
Publicité
Posté le 10-05-2010 à 21:46:43  profilanswer
 

n°1991987
gilou
Modérateur
Modzilla
Posté le 10-05-2010 à 21:50:40  profilanswer
 

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é!  --
n°1992005
popit
Posté le 10-05-2010 à 23:06:37  profilanswer
 

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

n°1992007
gilou
Modérateur
Modzilla
Posté le 10-05-2010 à 23:30:01  profilanswer
 

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é!  --
n°1992069
gilou
Modérateur
Modzilla
Posté le 11-05-2010 à 10:44:27  profilanswer
 

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é!  --
n°1992281
popit
Posté le 11-05-2010 à 20:55:01  profilanswer
 

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

n°1992288
gilou
Modérateur
Modzilla
Posté le 11-05-2010 à 21:29:41  profilanswer
 

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é!  --
n°1992296
popit
Posté le 11-05-2010 à 21:46:14  profilanswer
 

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

n°1992307
gilou
Modérateur
Modzilla
Posté le 11-05-2010 à 23:00:43  profilanswer
 

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é!  --
n°1992326
popit
Posté le 12-05-2010 à 01:19:01  profilanswer
 

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 ^^


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

  programme qui marche puis qui ne marche plus ??

 

Sujets relatifs
programme marche en mode normal mais pas en mode debugMon programme pr MSN marche plus
un programme simple qui marche pas (en If et Else)vo mieux voir le dernier msg de ce topic pour comprendre le 1er ??
programme python qui marche pas(lire dans un fichier ascii) pourquoi mon programme ne marche pas ?
prob C étrange : programme qui marche et personne ne comprend pourquoi[open gl] pourquoi mon programme marche pas ??? (tjs pas 2)
.net (beta) : programme ne marche que sur mon ordi !Testez mon programme utilitaire ! il marche c'est garanti !
Plus de sujets relatifs à : programme qui marche puis qui ne marche plus ??


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