Probleme avec la récursivité... SVP

Résolu
orbb Messages postés 17 Date d'inscription dimanche 25 juillet 2004 Statut Membre Dernière intervention 20 juillet 2007 - 19 déc. 2006 à 12:08
orbb Messages postés 17 Date d'inscription dimanche 25 juillet 2004 Statut Membre Dernière intervention 20 juillet 2007 - 19 déc. 2006 à 13:42
Bonjour, voici une fonction récursive :

void m(DWORD i, char stem [10] = "")
{
    if (i < 2)
    {
        stem[i] = 'a';
        m(i+1, stem);
// ici
        stem[i] = 'b';
        m(i+1, stem);
    }
    return;
}

elle est appelée dans le programme principale par : m(0, "zzz");
mon probleme, la variable "stem" n'est pas restitué apres retour d'un apel recursif (où jai placé le commentaire, par exemple), alors que la variable "i" est bien restitué...
commment faire pour regler ce probleme ?
merci

6 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 déc. 2006 à 13:17
#include <windows.h>
#include <string>
#include "resource.h"

using namespace std;

void m(DWORD i, string stem)
{
    if (i < 1)
    {
        stem[i] = 'a';
        m(i+1, stem);
        stem[i] = 'b';
        m(i+1, stem);
    }
    return;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    m(0, "zzz");
    return 0;
}

_____________________________________
Un éditeur de ressources gratuit pour Windows
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 déc. 2006 à 12:40
Normalement, ca ne devrait pas compiler, car "zzz" est une chaine constante.
Mais bon ca passe, et dans ce cas on ne sait pas trop ce qui peut se passer. En tous cas ce n'est pas surprenant que le chaine soit modifiée, car tu passes son adresse, elle est donc directement modifiée

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
orbb Messages postés 17 Date d'inscription dimanche 25 juillet 2004 Statut Membre Dernière intervention 20 juillet 2007
19 déc. 2006 à 12:46
OK merci, est ce possible de faire en sorte que la chaine soit locale a la fonction ? un peu comme la variable "i"
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 déc. 2006 à 12:52
1) Redéclarer un tableau local, et recopier stem dedans
void m(DWORD i, char stem [10] = "")
{
  char stemLocal[10];
  strcpy(stemLocal, stem);
  // Tu travailles sur stemLocal
  ...
}

2) Utiliser le template string, qui te permet de passer une chaine par valeur
void m(DWORD i, string stem)

{

  // stem est passé par valeur, tu peux le modifier localement

}
_____________________________________
Un éditeur de ressources gratuit pour Windows
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
orbb Messages postés 17 Date d'inscription dimanche 25 juillet 2004 Statut Membre Dernière intervention 20 juillet 2007
19 déc. 2006 à 13:09
merci, j'ai essayé la 2ème possibilité vu quelle correspond a ce que je veut faire, mais ca me donne une erreur a la compilation : parametre non reconnu ligne 5
voila le source, vous etes sure qu'on peut utiliser string comme parametre ?

#include <windows.h>
#include <string.h>
#include "resource.h"

void m(DWORD i, string stem)
{
    if (i < 1)
    {
        stem = 'a';
        m(i+1, stem);
        stem = 'b';
        m(i+1, stem);
    }
    return;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    m(0, 'z');
    return 0;
}
0
orbb Messages postés 17 Date d'inscription dimanche 25 juillet 2004 Statut Membre Dernière intervention 20 juillet 2007
19 déc. 2006 à 13:42
merci beaucoup, je vient de tester en ajoutant une messagebox, le resultat est correcte.
void m(DWORD i, string stem)
{
    if (i < 2)
    {
        stem[i] = 'a';
        m(i+1, stem);
          MessageBox(NULL, stem.data(), "Test", MB_OK);
        stem[i] = 'b';
        m(i+1, stem);
    }
    return;
}
merci encore
bye
0
Rejoignez-nous