probleme de endl

probleme de endl - C++ - Programmation

Marsh Posté le 02-10-2007 à 15:39:12    

J'ai un probleme sur lequel je plante totalement.
 
J'ai une fonction blabla :
 

Code :
  1. float blabla(int a, int b){
  2.    objet1 x;
  3.    double c=x.fonction1(a,b);
  4.    while(c<10) c=x.fonction1(a,b);
  5.    cout << endl;
  6.    return c;
  7. }


 
fonction1 est une méthode de la class objet1, elle genere un nombre aléatoire en gros.
Mon probleme est le suivant, le cout << endl; ne sert a rien comme vous l'avez remarqué, mais si je ne met pas cette ligne, le programme s'excute puis bloque, c est a dire qu'il n e fait rien. Par contre quand cette ligne est présente il n'y a aucun probleme. Quelqu'un aurait une idée sur l'origine de ce probleme ??  
 
Merci d'avance pour votre attention !


Message édité par patastronch le 02-10-2007 à 15:39:44
Reply

Marsh Posté le 02-10-2007 à 15:39:12   

Reply

Marsh Posté le 02-10-2007 à 15:40:45    

Je précise que cout << de n'importe quoi d'autre ca ne marche pas, y a que le endl ou le '\n' qui font que ca fonctionne.

Reply

Marsh Posté le 02-10-2007 à 19:37:50    

L'erreur est dans le code de ta fonction1....
est-ce que si tu remplaces le  
cout << endl;
par
cout.flush();
ca fait pareil ?

Reply

Marsh Posté le 02-10-2007 à 20:10:57    

quand ca plante et que ca marche en rajoutant une IO ca sent la memory leak qq part. Verifie le code de function1, ca n'a AUCUN rapport avec endl.

Reply

Marsh Posté le 04-10-2007 à 11:51:15    

Salut,
Est-ce qu'une erreur spécifique est affichée quand le programme plante? Genre segmentation fault? Car c'est fréquent que, quand un programme plante, si tu met par exemple un printf (donc cout aussi) au milieu pour faire un pseudo debug en affichant les valeurs des variables il se mette à ne plus planter.
Je suis donc la pensée de Ace17 et de Joel F: l'erreur est dans ton code (suivant ce que fait fonction1, il peut y avoir une division par zéro par exemple).
As-tu essayé d'exécuter ton code pas à pas avec un debugger? Sinon de pseudo débugger en affichant les valeurs de a, b et c à chanque pas du while? Voir s'il n'y a pas quelque chose de 'louche'.
@+

Message cité 1 fois
Message édité par grostony le 04-10-2007 à 11:51:44
Reply

Marsh Posté le 04-10-2007 à 19:08:05    

grostony a écrit :

c'est fréquent que, quand un programme plante, si tu met par exemple un printf (donc cout aussi) au milieu pour faire un pseudo debug en affichant les valeurs des variables il se mette à ne plus planter.

Ca, c'est surtout vrai quand tu es multithreade. D'ailleurs, a la relecture du post de l'auteur du topic, je me demande si ca n'est pas le cas. Sa description ressemble pas mal a un interblocage.

Message cité 1 fois
Message édité par Ace17 le 04-10-2007 à 19:08:24
Reply

Marsh Posté le 05-10-2007 à 10:14:33    

Ace17 a écrit :

Ca, c'est surtout vrai quand tu es multithreade. D'ailleurs, a la relecture du post de l'auteur du topic, je me demande si ca n'est pas le cas. Sa description ressemble pas mal a un interblocage.


Bah je sais pas, perso dans des programmes qui ne sont pas multithread (enfin je pense car je n'ai rien fait de spécial pour qu'il soit multithread) ça me le fait souvent. Pas d'exemple en tête mais plein de souvenirs de 'pseudo' debug quand j'étais à la fac :D.

Reply

Marsh Posté le 05-10-2007 à 11:49:58    

le multi thread n'a rien à voir. En general, ca provient d'un depassement de borne de tableau ou d'acces à une zone mémoire non allouée.

Reply

Marsh Posté le 05-10-2007 à 15:49:14    

C'est bien ce que je pensais, ça arrive dans un cas de plantage trivial (genre depassement de borne de tableau ou d'acces à une zone mémoire non allouée comme tu dis).
@+

Reply

Marsh Posté le 05-10-2007 à 19:39:05    

Joel F a écrit :

le multi thread n'a rien à voir. En general, ca provient d'un depassement de borne de tableau ou d'acces à une zone mémoire non allouée.

Bien sur que si, parce que la trace d'execution change le timing de ton programme, en plus de creer des points de rendez-vous inopportuns entre les threads.  Pour ces deux raisons, il est possible qu'un programme qui deadlocke sans trace d'exec s'execute sans probleme lorsqu'on rajoute des printfs.
 
Dans la grande majorite des cas, un depassement de borne de tableau ou l'acces a une zone memoire inexistante finit par provoquer une exception... ce qui n'est apparemment pas le cas. Ce serait bien que l'auteur du topic re-poste pour nous dire ou il en est.

Reply

Marsh Posté le 05-10-2007 à 19:39:05   

Reply

Marsh Posté le 05-10-2007 à 20:12:52    

Le cout.flush(); ou cout << flush; ne font pas marcher le programme. Seul cout << endl; fait que ca marche (a la fois j 'ai pas tout cherché non plus :) ). Les cout sur les variable sans endl a la fin ne font pas fonctionner le bout de code.
 
Quand le programme plante, aucun message d'erreur, juste ca fait plus rien, gdb me dit que le prog est coincé dans la fonction 1 fonction blabla (edit)  rien de plus.
 
Je reppel que avecle cout << endl; tout marche sans probleme ! Ce n'est donc pas une eventuelle division par zéro ou ce genre de chose qui provoque le plantage.
 
J'ai pas regardé si y avait du memory leak, je vais mater ca a tete reposée. Sinon j'ai reussi a faire fonctionner le programme sans cout << endl; en remplacant les double par des floats. C'est encore plus incomprehensible pour moi le fait que ca marche avec des floats et pas des doubles.
 
J'aimerais, meme si c est résolu, comprendre la source du probleme. Est ce que quelqu'un saurait exactement ce que fait cout << endl; de plus qu'un cout << flush, ou un cout de n'importe quoi ???


Message édité par patastronch le 05-10-2007 à 20:34:32
Reply

Marsh Posté le 05-10-2007 à 20:18:35    

Quand je dis seul cout << endl; fait que ca fonctionne c'est faux, il y a aussi cout << "\n"; :p

Reply

Marsh Posté le 05-10-2007 à 20:20:10    

endl = \n + flush ;)
 
et donne le code de cette fonction boudiou

Reply

Marsh Posté le 05-10-2007 à 20:30:29    

Alors qu'est ce qui différentie un cout << "\n" d'un cout << "a" ??? y abien un truc c'est pas possible.
 
Sinon pour le code ca risque d etre imbouffable, c est une fonction perdu au milieu de miliers de lignes :) Je vous le mettrais lundi qaund je serais au labo.

Reply

Marsh Posté le 05-10-2007 à 20:50:57    

bah cout comme printf effectue un flsuh lorsque on leur demande ou lorsque un \n arrive dans le buffer.

Reply

Marsh Posté le 05-10-2007 à 21:23:06    

l'ennuie c est que ca viens pas flush, puisque cout << flush ne fonctionne pas.

Reply

Marsh Posté le 06-10-2007 à 09:31:32    

patastronch a écrit :

l'ennuie c est que ca viens pas flush, puisque cout << flush ne fonctionne pas.

D'un cote, si y'a rien a  
flusher... essaie :
cout << "a"; cout.flush();
 
Mais bon, au final tous ces tests ne nous meneront pas tres loin :) Donne plutot le code de la fonction...

Reply

Sujets relatifs:

Leave a Replay

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