Copier le contenu d'un pointeur vers un autre avec redimentionnement automatique

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 075 fois - Téléchargée 35 fois

Contenu du snippet

Vous avez certainnement rencontré un jour un problème de redimensionnement de pointeur:
vous voulez copier des caractères vers un ptr, mais la taille allouée est trop petite
=> delete puis new. C'est quand même lourd à écrire à chaque fois
=> voici la solution
Cette fonction redimensionne automatiquement le pointeur si il est trop petit. C'est beaucoup plus propre puisque ca supprime tout l'espace alloue.

Source / Exemple :


char *Redim(char **Ch1,const char *Ch2) // redimension automatique
{
if(strlen(*Ch1) < strlen(Ch2))
  {
  delete[] *Ch1;

  • Ch1=new char[strlen(Ch2)+1];
} strcpy(*Ch1,Ch2); return *Ch1; }

Conclusion :


C'est du niveau 2: on travaille avec un pointeur de pointeur !!

Je vous garantis, c'est hyper utile pour simplifier l'écriture de ses applis. Je l'utilise tout le temps (et ce n'est pas du narcissisme)

Questions, commentaires, ... comme d'hab, laissez un message

A voir également

Ajouter un commentaire

Commentaires

cs_vieuxLion
Messages postés
455
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
6 avril 2004
7 -
bonne idée mais ...
des fautes ...
et des avertissements à donner aux utilisateurs de la fonction !

on libère la mémoire allouée par new[] en utilisant delete[]... pas delete
Avertir les utilisateurs d'utiliser la fonction UNIQUEMENT si le premier pointeur a été alloué sur le tas (par new) et non pas sur la pile ou l'allocation statique : sinon TRAP)
C'est bien d'avoir pensé à l'optimisation ... si longueur suffisante, pas de delete[]/new[]
Dire aussi que le return est du "confort", non nécessaire.
Tu aurais pû utiliser une référence de pointeur plutôt qu'un double pointeur car c'est plus simple à l'appel :
void Redim2(char *&pCh1,const char *pCh2)
{
if(strlen(pCh1) < strlen(pCh2))
{ delete []pCh1;
pCh1=new char[strlen(pCh2)+1];
}
strcpy(pCh1,pCh2);
}
superpa
Messages postés
113
Date d'inscription
lundi 24 février 2003
Statut
Membre
Dernière intervention
5 janvier 2004
-
Ok, thanks pour les améliorations.
1 précision:
return la destination peut s'avérer utile: ca permet de recopier en série redim(&p1,redim(&p2,redim(&p3,p4)));
et ca s'inscrit dans la lignée de strcpy.
Encore merci

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.