[HT?] Recursivite trop grande

Le
jeremie fouche
Bonjour

Peut être suis-je hors sujet

J'ai un programme c++ avec une forte recursivité. Quand j'execute mon
programme, tout ce passe apparement bien (pas de plantage en tout cas),
mais pourtant, je suis sur qu'il ne s'execute pas jusqu'au bout.

En gros :

std::cout << "DEBUT" << std::endl;
MaBelleFonctionRecursive();
std::cout << "FIN" << std::endl;

Je vois bien DEBUT, mais je ne vois pas FIN, alors que je n'ai aucun
message, et que le programme m'a rendu la main.

Une trop grande recursivité peut elle stopper l'execution d'un programme
(dépassement de la pile probablement) sans informer l'utilisateur ?

Merci pour vos lumières
--
Jérémie
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fabien LE LEZ
Le #19014011
On Mon, 30 Mar 2009 15:57:54 +0200, jeremie fouche
Une trop grande recursivité peut elle stopper l'execution d'un programme
(dépassement de la pile probablement) sans informer l'utilisateur ?



Ça dépend du compilo, et des options de compilations.

Sous VC++, avec les options par défaut, oui, ça m'est déjà arrivé.
jeremie fouche
Le #19014171
Fabien LE LEZ a écrit :
On Mon, 30 Mar 2009 15:57:54 +0200, jeremie fouche
Une trop grande recursivité peut elle stopper l'execution d'un programme
(dépassement de la pile probablement) sans informer l'utilisateur ?



Ça dépend du compilo, et des options de compilations.

Sous VC++, avec les options par défaut, oui, ça m'est déjà arrivé.



J'utilise g++ 3.4.5, avec et sans option de debug (-g), le bon vieux
-Wall, et c'est tout.
Bon, je prends ça pour un oui, et je vais voir si je peux utiliser une
autre technique...
--
Jérémie
jeremie fouche
Le #19014161
Fabien LE LEZ a écrit :
On Mon, 30 Mar 2009 15:57:54 +0200, jeremie fouche
Une trop grande recursivité peut elle stopper l'execution d'un programme
(dépassement de la pile probablement) sans informer l'utilisateur ?



Ça dépend du compilo, et des options de compilations.

Sous VC++, avec les options par défaut, oui, ça m'est déjà arrivé.



J'utilise g++ 3.4.5, avec et sans option de debug (-g), le bon vieux
-Wall, et c'est tout.
Des options supplementaires permettent elles de passer outre ?
Bon, je prends ça pour un oui, et je vais voir si je peux utiliser une
autre technique...
--
Jérémie
jeremie fouche
Le #19014151
Fabien LE LEZ a écrit :
On Mon, 30 Mar 2009 15:57:54 +0200, jeremie fouche
Une trop grande recursivité peut elle stopper l'execution d'un programme
(dépassement de la pile probablement) sans informer l'utilisateur ?



Ça dépend du compilo, et des options de compilations.

Sous VC++, avec les options par défaut, oui, ça m'est déjà arrivé.



J'utilise g++ 3.4.5, avec et sans option de debug (-g), le bon vieux
-Wall, et c'est tout.
Bon, je prends ça pour un oui, et je vais voir si je peux utiliser une
autre technique... (m'arrange pas, ça)
Des options supplementaires permettent elles de passer outre ?
--
Jérémie
pjb
Le #19014781
jeremie fouche
Fabien LE LEZ a écrit :
On Mon, 30 Mar 2009 15:57:54 +0200, jeremie fouche
Une trop grande recursivité peut elle stopper l'execution d'un
programme (dépassement de la pile probablement) sans informer
l'utilisateur ?



Ça dépend du compilo, et des options de compilations.

Sous VC++, avec les options par défaut, oui, ça m'est déjà arrivé.



J'utilise g++ 3.4.5, avec et sans option de debug (-g), le bon vieux
-Wall, et c'est tout.
Bon, je prends ça pour un oui, et je vais voir si je peux utiliser une
autre technique... (m'arrange pas, ça)
Des options supplementaires permettent elles de passer outre ?



std::cout << "DEBUT" << std::endl;
MaBelleFonctionRecursive();
std::cout << "FIN" << std::endl;


Si tu faisais en sorte que l'appel récursif soit terminal, le
compilateur gcc pourrait alors l'optimiser et éviter d'utiliser trop
de pile.

result_type MaBelleFonctionRecursive(parameter_type i){
if(condition_d_arret(i)){
return(terminer(i));
}else{
return(MaBelleFonctionRecursive(reduire(i))); // appel recursif terminal.
}
}


--
__Pascal Bourguignon__
Doms
Le #19018511
Bonjour,

Si tu faisais en sorte que l'appel récursif soit terminal, le
compilateur gcc pourrait alors l'optimiser et éviter d'utiliser trop
de pile.



Je pense que le compilo a deja fait un travail pour que
la fonction ne soit pas récursive sinon le programme terminerait... mal
par un stack overflow.

Je pense que le problème est que la condition d'arret de la condition
d'arret de la fonction récursive (que l'on a pas dans la demande) est fausse
voire inexistante. Sans plus de detail, on ne peut trancher...

Notons qu'avec VS5, avant le SP1, j'avais eu le problème d'une optimisation
qui transformait ma récursion pour la limiter mais qui foirait le test d'arret... J'ai
mis un certain temps à comprendre que c'était un bug du compilo (qui n'apparaissait
pas en DEBUG). Là, j'ai un doute sur le fait que se soit cela...

Doms.
James Kanze
Le #19019711
On Mar 30, 3:57 pm, jeremie fouche
Peut être suis-je hors sujet...



Non.

J'ai un programme c++ avec une forte recursivité. Quand
j'execute mon programme, tout ce passe apparement bien (pas de
plantage en tout cas), mais pourtant, je suis sur qu'il ne
s'execute pas jusqu'au bout.



En gros :



std::cout << "DEBUT" << std::endl;
MaBelleFonctionRecursive();
std::cout << "FIN" << std::endl;



Je vois bien DEBUT, mais je ne vois pas FIN, alors que je n'ai
aucun message, et que le programme m'a rendu la main.



Une trop grande recursivité peut elle stopper l'execution d'un
programme (dépassement de la pile probablement) sans informer
l'utilisateur ?



Selon la norme : si tu épuises les ressources du système, tu as
un comportement indéfini. Donc, oui. Formellement, au moins,
tout peut arriver. Du point de vue de qualité de
l'implémentation, je m'attendrais à un core dump, ou son
équivalent sous Windows. (Au minimum : en fait, je préfèrerais
un abort propre, avec message d'erreur.)

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
jeremie fouche
Le #19031141
jeremie fouche a écrit :
Bonjour

Peut être suis-je hors sujet...

J'ai un programme c++ avec une forte recursivité. Quand j'execute mon
programme, tout ce passe apparement bien (pas de plantage en tout cas),
mais pourtant, je suis sur qu'il ne s'execute pas jusqu'au bout.

En gros :

std::cout << "DEBUT" << std::endl;
MaBelleFonctionRecursive();
std::cout << "FIN" << std::endl;

Je vois bien DEBUT, mais je ne vois pas FIN, alors que je n'ai aucun
message, et que le programme m'a rendu la main.

Une trop grande recursivité peut elle stopper l'execution d'un programme
(dépassement de la pile probablement) sans informer l'utilisateur ?

Merci pour vos lumières



Merci pour vos réponses

Je n'ai pas trouvé l'origine du problème, mais en cassant la récursivité
afin de ne plus en avoir, mon programme fonctionne correctement, (et
prend beaucoup mois de ressources).

--
Jérémie
Publicité
Poster une réponse
Anonyme