Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[HT?] Recursivite trop grande

8 réponses
Avatar
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

8 réponses

Avatar
Fabien LE LEZ
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é.
Avatar
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...
--
Jérémie
Avatar
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.
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
Avatar
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 ?
--
Jérémie
Avatar
pjb
jeremie fouche writes:

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__
Avatar
Doms
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.
Avatar
James Kanze
On Mar 30, 3:57 pm, jeremie fouche wrote:

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
Avatar
jeremie fouche
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