Stack overflow !!!! [Résolu]

Signaler
Messages postés
55
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 novembre 2008
-
Messages postés
55
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 novembre 2008
-
salut, je fais un jeux de taquin en C++ avec visual studio 6.0.

j'utilise la recherche en profondeur, Hill climging et A* chaque et un programme à part.

pour la recherche en profondeur j'ai eu l'erreur stack overflow.

j'utilise un arbre comme structure et à l'aide d'une fct récursive je
construit cet arbre et cherche la solution en meme temps, mais apres
10333 appel recursif, le programme s'arrete.

en debuggant  j'ai trouvé que l'erreur est stack overflow.

question : peut on  augmenter cette pile?  si vous avez des idées pour 
résoudre mon probleme sans  changer la  fct  recursive par une autre
itérative, svp partagez les avec moi?

merci et @++ 

6 réponses

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
20
Salut,
je crois que VC6 alloue 1MO par défaut pour la pile, on peut toujours l'augmenter avec l'option  :
/STACK:reserve[,commit]
de l'éditeur de lien. Exemple :
/STACK:1048576,4096

ou option
Propriétés projet/linker/systeme/taille de réserve de pile/
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Si tu as plusieurs params à ta fonction, tu fais une struct et tu en passes l'adresse, ainsi que 4 octets par tour sur la pile (enfin presque...).

La seule vraie solution restera malgré tout de virer la récursivité, c'est une nuisance pour les perfs et pour la pile.

ciao...
BruNews, MVP VC++
Messages postés
55
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 novembre 2008

salut
[auteurdetail.aspx?ID=39449 BruNews] 
pour les parametres c juste 1:     bool arbre::profondeur(noeud*)
pour les 4 octets, on fais comment?
merci et @++

 
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Chaque param sur system 32 bits est de 4 octets, rien à faire de spécial.
Mais comme EIP est empilé en 1er, ça t'en fait 8.

ciao...
BruNews, MVP VC++
Messages postés
55
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 novembre 2008

salut
[auteurdetail.aspx?ID=39449 BruNews] donc comme t'as dit la seule solution est d'enlever la recursivité.
mais une fct iterative pour un arbre!!!
merci bien pour la rapidité de la reponse. je vais essayer de combiner les 2.
merci et @++
Messages postés
55
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 novembre 2008

salut



[auteurdetail.aspx?ID=195004 yann_lo_san], ta reponse prouve qu'avant de poser une question sur ce site, il faut voir la MSDN avant.
j'accepte ta reponse. mais  39375  appels recursifs pour un exemple sans la recursivité pour afficher le chemin de la solution c trop. La solution idéale c de convertir en iteratif.