|
Bas de page | |
---|---|
Auteur | Sujet : Débordement de pile irréparable ? |
C-user | Bonjour à tous, Voici mon souci : pour résoudre un problème de trajet sur une grille 10*20 (un genre de labyrinthe si on veut), j'ai tenté d'écrire un programme en c qui liste toutes les possibilités et sélectionne la réponse en fonction de différents critères (de l'énoncé). Du coup j'apprends (enfin ré-apprends ^^) le retour sur trace ... Évidemment, comme à chaque récursion on met un tableau de 200 entiers en mémoire, et bien la pile déborde Après quelques tests je constate que la boucle 'for' n'est ouverte que 2 ou 3 fois, soit 2 ou 3 récursions, alors qu'il m'en faudrait ... un nombre ÉNORME !! (et pas beaucoup réductible...) Voici mon code si ça peut aider :
Y a-t-il un moyen d'échapper à ce problème, par exemple en agrandissant la pile (quitte à monopoliser toute la machine) ou en modifiant le code pour remplacer la récursion ?
Message cité 1 fois Message édité par C-user le 30-07-2014 à 17:47:32 |
Publicité | Posté le 28-07-2014 à 19:21:40 |
tpierron |
|
rufo Pas me confondre avec Lycos! | Pour info, tout algo récursif peut être transformé en algo itératif. L'algo itératif est généralement plus rapide (car pas d'appels successifs à la fonction et empilement du contexte) et on maîtrise mieux les critères d'arrêt, évitant le buffer overflow. --------------- Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta |
gilou ModérateurModzilla |
Pas du tout:
--------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
C-user | Alors tout le monde, avez-vous encore des idées ?
|
Publicité | Posté le 03-08-2014 à 18:53:25 |
gilou ModérateurModzilla |
--------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
C-user | Au temps pour moi il y a une coquille !
|
gilou ModérateurModzilla | Pour continuer à comprendre ton code, et ses appels récursifs, c'est la fonction récursive qu'il faudrait corriger:
Message édité par gilou le 05-08-2014 à 15:06:38 --------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
C-user | Pardon d'insister mais toutes les variables utilisées sont bien initialisées, dès la première ligne :
|
C-user | Au fait, l'effet de bord de 'deplace' est voulu : en modifiant les coordonnées de la case ciblée, elle permet d'avancer dans la grille.
|
ddr555 | elles sont déclarées, mais pas initialisées, c'est à dire que tu leur donnes une valeur Message édité par ddr555 le 05-08-2014 à 16:18:56 |
gilou ModérateurModzilla |
La sortie de route (ie vérification des paramètres aux limites) est un code standard et n'a aucune raison de faire peur.
--------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
gilou ModérateurModzilla |
Ceci est une déclaration et non une initialisation
Ici on a effectivement des affectations, mais ce code ne figurait nulle part dans ce que tu avais posté auparavant.
--------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
C-user | Ah oui j'ai toujours confondu initialiser et déclarer pour le c, tout simplement parce que la nuance à mon petit niveau n'a jamais eu que peu d'importance ..
|
Yonel Monde de merde ! |
|
gilou ModérateurModzilla |
C'est juste faux si la récursion en question est de la tail recursion.
--------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
gilou ModérateurModzilla |
Son algo (tel qu'actuellement donné dans son code) numérote de manière croissante les cases d'un tableau rectangulaire. Il part de la case avec le plus grand numero r (au premier pas, c'est la case initialisée a 1 qui est trouvée) et cherche une une case a 0 autour. S'il en trouve une, il y met r+1 et s'appelle récursivement. Si l'appel revient a vrai (ie il a pu numéroter récursivement le reste du tableau), il retourne avec vrai et sinon, il remet la case trouvée a 0 et cherche une autre case voisine a numéroter pour faire la même chose. Si aucune case voisine ne convient, il revient avec faux.
--------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
C-user | Promis je fais attention maintenant
Jackpot !
|
C-user | Gilou a parfaitement expliqué, merci à toi !
Message édité par C-user le 06-08-2014 à 12:13:03 |
gilou ModérateurModzilla |
Ça me semblait pas logique, et j'ai compris pourquoi: l'implémentation de l'algo est foireuse!
--------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
C-user |
|
C-user | À tout hasard, je vous fais part des pistes explorées en parallèles, en espérant que ça inspire quelqu'un
|
gilou ModérateurModzilla | Bon en tout cas, si vous avez toujours un débordement de pile, c'est que manifestement votre implémentation est viciée (au plus, on a 84 appels récursifs sur la pile, ce qui est minime).
Message édité par gilou le 06-08-2014 à 22:54:33 --------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
C-user | Ouaip ça marche aussi bien sûr. Je viens de faire le test chez moi de compiler et exécuter ton code, pas de soucis ça me sort une solution (et on pourrait s'arranger pour les avoir toutes). En revanche pas d'amélioration pour le mien : toujours rien de notable à la compil, mais comme d'habitude le fameux : Au fait, sérieusement, ça lui arrive de TROUVER une solution aux problèmes ?
Message édité par C-user le 06-08-2014 à 23:39:44 |
gilou ModérateurModzilla | Ben déjà, tracez le nb d'appels récursifs a votre routine estValide.
--------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
C-user | Tiens, je croyais avoir posté un message là-dessus, pas dû cliquer où il fallait... Apparemment, 'estValide' se lance une seule fois. Elle appelle alors 'deplace' vers le haut (cas 1). Je rajoute des balises dans la fonction, comme ça :
Et en console j'obtiens :
Il se passe quelque chose entre les repères 1 et 2 ! => Y a-t-il un problème dans ma façon de tester la case du tableau ? Est-il interdit d'écrire comme ça avec un passage par adresse ?? Message édité par C-user le 07-08-2014 à 12:54:54 |
C-user | J'ai donc fait un test :
Et ici il n'y a aucun problème, le chiffre 6 apparaît bien en sortie... Ce soir je teste ton code en l'adaptant à mes dimensions (10*20). Le programme tourne depuis 3 heures. Tant pis pour ce soir Message édité par C-user le 08-08-2014 à 00:35:52 |
C-user | Cher Gilou, je crois bien qu'il y a dans ton code un souci avec le retour sur traces.
|
gilou ModérateurModzilla |
Possible, mais s'il y a maintenant des culs de sac, c'est que les specs initiales ont changé?
Message édité par gilou le 10-08-2014 à 00:27:44 --------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
C-user | Pour la "nouvelle" condition : le tracé ne doit pas se recouper, ça tu le savais, mais également il ne doit même pas revenir à son contact. C'est-à-dire que chaque case non-nulle #n (autre que départ et arrivée) doit être en contact avec exactement 2 cases non-nulles : #(n-1) et #(n+1).
|
Publicité | Posté le |
Sujets relatifs | |
---|---|
Débordement d'une image en dehors de l'écran | [Java] Liste chaînée - Pile |
erreur a supprimer | pile , la fonction qui depile ne marche pas [résolu] |
Initialisation d'une pile de réseaux de neurones. | [REXX] Ecritures multiples à partir d'une pile ? |
pile et file en pascale | allocation sur le tas vs pile |
Tri shell d'une pile | pile et programme |
Plus de sujets relatifs à : Débordement de pile irréparable ? |