IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

problème allocation mémoire


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 14
    Points : 12
    Points
    12
    Par défaut problème allocation mémoire
    Salut à tous,

    je vous explique mon problème. Je réalise une fonction récursive qui cherche dans une chaine de caractère toutes les occurences d'un caractère

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void TChaine::find_char (int *position, const char s, int b, int end, int l, int uniq)
    {
    	int i=b;
    	for (;i<end;i++)
    	{
    		if (mChaine[i] == s)
    		{
    			l++;
    			cout << "caractère présent (" << l << ") : " << i << "\n";
    			find_char (position, s, (i+1), end, l, uniq);
    			*(position+l-1) = i;
    			break;
    		}
    	}
     
    	if (i==end)
    	{
    		position = new int[l];
    		cout << "initialisation du tableau success \n";
    	}
    }
    Je ne sais pas si c'est la meilleur manière de procéder, je trouvais intéressant le fait de procéder ainsi! Allocation de la mémoire pour le tableau en fin de parcours, ensuite je le remplis.

    Plusieurs questions :

    1. Ca plante sur : *(position+l-1) = i;
    Pour information le tableau est bien pris en compte lors de son instanciation mais plus lorsque l'on remonte dans la récursivité !?

    2. Je me sert de ce tableau à l'exterieur de la fonction. Suis je obligé de desallouer la mémoire ?!

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ta gestion de la mémoire semble bizarre... En tout cas tu n'arriveras jamais à ce que tu veux en réallouant un nouveau tableau d'un seul élement à chaque appel récursif.

    Pourquoi ne pas simplement faire un truc à base de std::string avec sa fonction find, et un std::vector pour stocker les résultats par exemple ?

    Plus de détails sur ces classes dans la FAQ C++.

    Remarque : quel est l'intérêt de la récursivité ici ?

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    je n'ai pas précisé ...
    la classe string est "banie"!

    et aussi

    je fais une allocation de L élément. Variable que j'incrémente à chaque fois que je trouve une occurence!

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu devrais renommer ta variable "l" (au moins sur ce forum), parce qu'on ne voit absolument pas la différence entre l et 1.

    A part ça, effectivement si tu réalloues ton tableau à chaque fois alors tu as un problème. Notamment que son contenu sera perdu (à la fois pour toi au niveau des valeurs, et pour le système au niveau de la mémoire).

    Utilise donc un std::vector, à moins que ce ne soit banni également (d'ailleurs, pourquoi ? exo scolaire ?).

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Je dois réaliser une fonction explode! (Oui c'est scolaire)

    Je lui passe en paramètre un pointeur ensuite il se débrouille pour allouer la mémoire et le remplir ... Je n'alloue le tableau que lorsque je me trouve en fin de recursivité (lorsqu'il arrive en fin de chaine : i==end).

    J'essaie de m'inspirer un peu du style de programmation des fonctions comme strcat (j'en suis loin, je sais ) ou l'on envoie un pointeur en paramètre et qui se charge du reste!

    le code sera effectivement plus propre ainsi (c'est encore qu'une ébauche)

    Voici la fonction appelante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TChaine* TChaine::explode(const char s)
    {
    	int *position;
    	find_char (position, ' ', 0, rendreTaille(), 0, 1);
    	return NULL;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    /**
    * @param position pointeur sur le tableau de position à allouer et remplir 
    * @param s occurence à trouver
    * @param b begin
    * @param end end
    * @param length longeur du tableau de position (interne à la fonction)
    * @param uniq par la suite évitera les doublons (ne sert à rien pour l'instant)
    */
     
    void TChaine::find_char (int *position, const char s, int b, int end, int length, int uniq)
    {
       int i=b;
       for (;i<end;i++)
       {
          if (mChaine[i] == s)
          {
             l++;
             cout << "caractère présent (" << length << ") : " << i << "\n";
             find_char (position, s, (i+1), end, length, uniq);
             *(position+length-1) = i;
             break;
          }
       }
     
       if (i==end)
       {
          position = new int[length];
          cout << "initialisation du tableau success \n";
       }
    }

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    le problème est du au fait que je fasse une allocation mémoire qui n'est pris en compte qu'en locale !? je pense.
    je pensais que étant donné que la variable position était un pointeur, il était possible de la modifier de manière globale!

  7. #7
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 83
    Points : 71
    Points
    71
    Par défaut
    deja change ta boucle for comme ca for(int i=b;i<end;i++)

    ca me fait mal de voir ca !

    tchao

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je n'alloue le tableau que lorsque je me trouve en fin de recursivité (lorsqu'il arrive en fin de chaine : i==end)
    Oui mais ce sera fait pour chaque appel récursif, et non une seule fois comme il faudrait le faire.

Discussions similaires

  1. Problème allocation mémoire
    Par Nico28 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 16/07/2010, 14h04
  2. Problème allocation mémoire
    Par Keewee dans le forum C++
    Réponses: 17
    Dernier message: 14/03/2008, 13h33
  3. Problème allocation mémoire
    Par Hurin dans le forum Débuter
    Réponses: 7
    Dernier message: 04/02/2008, 23h03
  4. Problème allocation mémoire - malloc () 1Gb
    Par Gellius31 dans le forum Bibliothèque standard
    Réponses: 14
    Dernier message: 21/12/2007, 12h16
  5. Problème allocation mémoire
    Par Arnaud F. dans le forum C
    Réponses: 9
    Dernier message: 08/04/2007, 13h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo