programme qui marche puis qui ne marche plus ?? - C - Programmation
Marsh Posté le 09-05-2010 à 16:55:18
Code :
|
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+,
Marsh Posté le 09-05-2010 à 21:31:36
popit a écrit : Bonjour, |
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...
Marsh Posté le 10-05-2010 à 19:23:38
ReplyMarsh 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 ?
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
Marsh Posté le 10-05-2010 à 20:46:24
404 Not Found a écrit : |
Oui c'est quoi, je ne me suis jamais demandé? un scalaire?
Marsh Posté le 10-05-2010 à 21:26:40
404 Not Found a écrit : |
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+,
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 :
|
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+,
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 ?
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+,
Marsh Posté le 10-05-2010 à 23:06:37
La boucle do while c'est pour tout le programme pour le recommencer ^^
Marsh Posté le 10-05-2010 à 23:30:01
Bon sinon, tu as un pb de conception ici:
Code :
|
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+,
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 :
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+,
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 =)
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+,
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 ?!
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+,
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 ^^
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 édité par popit le 12-05-2010 à 01:17:37