CLASSE SSTRING OU LA MANIPULATION DES "STRING" PLUS INTUITIVE
plus_plus_fab
Messages postés232Date d'inscriptionvendredi 9 janvier 2004StatutMembreDernière intervention 8 janvier 2005
-
11 déc. 2004 à 12:47
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 mars 2011
-
31 mai 2005 à 19:09
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
sachant que tu as la précond que Objets soit bien init
Allé
NoRabbit, dslé pour tout ceci et cette conv s'arrete ici (pour éventuellement reprendre ds un post du forum)
Kénavo - Nono.
_______________________________________________
CChargy
Messages postés126Date d'inscriptionsamedi 24 avril 2004StatutMembreDernière intervention 6 janvier 2008 31 mai 2005 à 17:02
Oui mais je ne veut pas mettre dans une console et puis je ne vois pas ce que ca change ...
Et puis a la place du quel =?
Colin CHARGY
colin_chargy@hotmail.com
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 mars 2011 31 mai 2005 à 09:14
à la place du = que tu commente met
printf("#%s#",sstr_test1 );
et voit ce que tu obtient.
B
CChargy
Messages postés126Date d'inscriptionsamedi 24 avril 2004StatutMembreDernière intervention 6 janvier 2008 30 mai 2005 à 19:31
Pardon,
je n'ai pas tout compris . . .
En gros, qu'est-ce qu'il faut que je fasse?
Colin CHARGY
colin_chargy@hotmail.com
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 mars 2011 30 mai 2005 à 09:16
Colin :
avec des messageBox ou des printf ou en débug
controle que ta chaine comporte exactement la mm chose....
un car entrée ou autre peut fausser ton analyse
++
Nono.
NoRabbit
Messages postés224Date d'inscriptionsamedi 26 juillet 2003StatutMembreDernière intervention30 mars 2009 28 mai 2005 à 15:58
sorry mec, j'ai pas trop le temps de me pencher là dessus
bonne chance qd même
CChargy
Messages postés126Date d'inscriptionsamedi 24 avril 2004StatutMembreDernière intervention 6 janvier 2008 28 mai 2005 à 15:40
Hello,
très bien ta classe, mais j'ai un petit souycis d'utilisation. Il faudra que je récupère le contenu d'un fichier et que je le découpe en morceaux. Pour l'instant, j'ai rfais comme ca:
if((file = fopen(T, "r")) != NULL) //on ouvre le fichier et verifie si on y arrive
{
while (!feof(file))// si on est pas arrivé a la fin
{
fread(&szBuffer, true, true, file); //on range les caractere dans le buffer
la ca marche mais quand j'enlève la ligne:
sstr_test1 = "Colinnn/1/200/200/80/90/1;Duco/1/200/200/80/90/2;Ducojh/1/20/20/80/90/2";
ca marche plus
Or le prog li correctemnt mon fichier c'ast sur...
As-tu un conseil pour moi
Merci
Colin CHARGY
colin_chargy@hotmail.com
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 mars 2011 13 déc. 2004 à 17:29
pas mal
pour la compléter voir les BString de ma conception
sinon, je ne comprends pas pkoi tout au long de ta classe tu préfere retourner des char* plutot que des SString. cela appelle tes opérateurs de cast à chaque fois...
Magicalement
Nono.
NoRabbit
Messages postés224Date d'inscriptionsamedi 26 juillet 2003StatutMembreDernière intervention30 mars 2009 11 déc. 2004 à 19:37
quand je me relis pour la concaténation, ça me parait bizarre, mais le résultat me pousse à penser ça...
NoRabbit
Messages postés224Date d'inscriptionsamedi 26 juillet 2003StatutMembreDernière intervention30 mars 2009 11 déc. 2004 à 19:34
pour le constructeur par copie, je ne vois pas (du genre : sString(const sString a); ?)--> si c'est ça, il y a une erreur lors de la compilation.
sinon pour la concaténation, je n'utilise pas directement sString car dans cette opération il peut y avoir des chaînes de caractères de type "char" qui, si j'utilise le type sString, ne sont pas prises en compte (j'ai mis les deux versions dont une en commentaire pour les tests)
...sinon je désaloue buffer_sz maintenant
j'attends de voir pour le constructeur par copie avant de reposter la source
mezaya
Messages postés202Date d'inscriptiondimanche 18 mai 2003StatutMembreDernière intervention 6 mars 2010 11 déc. 2004 à 18:43
Pas mal mais comme la dit plus_plus_fab il manque le constructeur par copie qui est trés important (appellé a chaque fois qu'une classe sString est passer en paramètre) Surtout dans les classe qui font l'allocation dynamique.
il est préférable de retrouner String& pour les opérateurs d'affectations (=) cela permet de faire des chaines d'affectation ( a=b=c ).
pour la concategnation pourquoi tu n'utilise pas directement ton sString resultat
{
sString resultat;
resultat.len_tmp=a.len_tmp + b.len_tmp;
if(resultat.buffer) delete[] resultat.buffer;
resultat.buffer = new char[len_sz + 1];
for (i=0; i < a.len_tmp ; i++)
resultat.buffer[i] = a.buffer[i];
for (i2=0 ; i < len_sz ; i++,i2++)
resultat.buffer[i] = b.buffer[i2];
resultat.buffer[len_sz] = '\0';
return Resultat;
}
car dans ta fonction tu ne désalloue pas buffer_sz.
NoRabbit
Messages postés224Date d'inscriptionsamedi 26 juillet 2003StatutMembreDernière intervention30 mars 2009 11 déc. 2004 à 16:13
ok, tkx !
les "delete" ont été ajoutés sauf pour le destructeur, une erreur se produit lorsqu'on concatène 2 chaînes (opérateurs + et +=)
Sans le delete dans le destructeur, aucune erreur ne se produit.
plus_plus_fab
Messages postés232Date d'inscriptionvendredi 9 janvier 2004StatutMembreDernière intervention 8 janvier 2005 11 déc. 2004 à 14:31
il y a une fuite memoire quand tu ne libere pas les objets que tu alloues.
char* p = new char[50];
p = new char[30];
la, tu as perdu 50 octets, ils ne sont en effet plus référencé et il n'est plus possible de les liberer.
char* p = new char[50];
delete [] p;
p = new char[30];
la, c'est bon.
delete[] dans le destructeur aussi !
while(*b)
{
b++;
len_b++;
}
au lieu de faire ça, tu peux faire len_b = strlen(b);
tes typedef, ils polluent quand meme bien l'espace de nom global !
NoRabbit
Messages postés224Date d'inscriptionsamedi 26 juillet 2003StatutMembreDernière intervention30 mars 2009 11 déc. 2004 à 13:32
ha ok, pour le delete mais peux tu quand même expliquer comment les fuites de mémoire se produisent ?
tkx !
NoRabbit
Messages postés224Date d'inscriptionsamedi 26 juillet 2003StatutMembreDernière intervention30 mars 2009 11 déc. 2004 à 13:28
taille de la chaîne = sString.Len();
pour les opérateurs +, +et, des fuites mémoires ? sur quoi faut il faire un delete ? peux tu expliquer comment les fuites de mémoire se produisent ?
tkx !
pour les typedef, c'est juste pour montrer leur utilisation.
plus_plus_fab
Messages postés232Date d'inscriptionvendredi 9 janvier 2004StatutMembreDernière intervention 8 janvier 2005 11 déc. 2004 à 12:47
Salut,
il manque le copy constructeur.
pour prendre la taille d'une chaine de caractere : strlen() de <cstring> (<string.h>), pour copier strcpy.
les operateurs +, +=, =, provoque des fuites memoires abominables ! Il faut faire un delete avant de réallouer !
et les typedef sstring, Sstring, ... c'est pas tres utile amha.
31 mai 2005 à 19:09
fais le avec un messageBox
et bien evidemment le
sstr_test1 = "Colinnn/1/200/200/80/90/1;Duco/1/200/200/80/90/2;Ducojh/1/20/20/80/90/2";
mais sérieusement,
ta question n'a rien trop a faire ici et polue plutot cette source.
si tu en as d'autre crée un post dans le forum
Magicalement
Nono.
__________________________
PS : je te donne une version de ton code qui marche
avec les Bxxx (regarde mes publications : BFichierTxt & BString)
BString sstr_test2 ,sstr_test1=BString BFichier::getContenu(T)
//"Colinnn/1/200/200/80/90/1;Duco/1/200/200/80/90/2;Ducojh/1/20/20/80/90/2
unsigned int ii,i,taille2,taille=sstr_test1.getNbOccurence(';');
if(!i)return;
for(i=0 ; i<=taille ; i++)
{
sstr_test2 =sstr_test1.getIemeMot(i,';');
taille2=sstr_test2.getNbOccurence('/');
for(ii=0 ; ii<taille2; ii++) {
Objets[i][ii] =sstr_test1.getIemeMot(i,'/');
}
sachant que tu as la précond que Objets soit bien init
Allé
NoRabbit, dslé pour tout ceci et cette conv s'arrete ici (pour éventuellement reprendre ds un post du forum)
Kénavo - Nono.
_______________________________________________
31 mai 2005 à 17:02
Et puis a la place du quel =?
Colin CHARGY
colin_chargy@hotmail.com
31 mai 2005 à 09:14
printf("#%s#",sstr_test1 );
et voit ce que tu obtient.
B
30 mai 2005 à 19:31
je n'ai pas tout compris . . .
En gros, qu'est-ce qu'il faut que je fasse?
Colin CHARGY
colin_chargy@hotmail.com
30 mai 2005 à 09:16
avec des messageBox ou des printf ou en débug
controle que ta chaine comporte exactement la mm chose....
un car entrée ou autre peut fausser ton analyse
++
Nono.
28 mai 2005 à 15:58
bonne chance qd même
28 mai 2005 à 15:40
très bien ta classe, mais j'ai un petit souycis d'utilisation. Il faudra que je récupère le contenu d'un fichier et que je le découpe en morceaux. Pour l'instant, j'ai rfais comme ca:
if((file = fopen(T, "r")) != NULL) //on ouvre le fichier et verifie si on y arrive
{
while (!feof(file))// si on est pas arrivé a la fin
{
fread(&szBuffer, true, true, file); //on range les caractere dans le buffer
//on affiche ce que contient le buffer
sstr_test1 += szBuffer;
}
fclose(file);
}
/*list = (char *)fichier;
sstr_test1 = list;
sstr_test1 = (char)fichier;*/
sstr_test1 = "Colinnn/1/200/200/80/90/1;Duco/1/200/200/80/90/2;Ducojh/1/20/20/80/90/2";
sstr_test2 = sSplit(sstr_test1 , ";" , -1 , taille);
for(i=0 ; i<taille ; i++) {
sstr_test3 = sSplit(sstr_test2[i] , "/" , -1 , taille2);
for(ii=0 ; ii<taille2; ii++) {
Objets[i][ii] = (int) sstr_test3[ii].to_Int();
}
la ca marche mais quand j'enlève la ligne:
sstr_test1 = "Colinnn/1/200/200/80/90/1;Duco/1/200/200/80/90/2;Ducojh/1/20/20/80/90/2";
ca marche plus
Or le prog li correctemnt mon fichier c'ast sur...
As-tu un conseil pour moi
Merci
Colin CHARGY
colin_chargy@hotmail.com
13 déc. 2004 à 17:29
pour la compléter voir les BString de ma conception
sinon, je ne comprends pas pkoi tout au long de ta classe tu préfere retourner des char* plutot que des SString. cela appelle tes opérateurs de cast à chaque fois...
Magicalement
Nono.
11 déc. 2004 à 19:37
11 déc. 2004 à 19:34
sinon pour la concaténation, je n'utilise pas directement sString car dans cette opération il peut y avoir des chaînes de caractères de type "char" qui, si j'utilise le type sString, ne sont pas prises en compte (j'ai mis les deux versions dont une en commentaire pour les tests)
...sinon je désaloue buffer_sz maintenant
j'attends de voir pour le constructeur par copie avant de reposter la source
11 déc. 2004 à 18:43
il est préférable de retrouner String& pour les opérateurs d'affectations (=) cela permet de faire des chaines d'affectation ( a=b=c ).
pour la concategnation pourquoi tu n'utilise pas directement ton sString resultat
{
sString resultat;
resultat.len_tmp=a.len_tmp + b.len_tmp;
if(resultat.buffer) delete[] resultat.buffer;
resultat.buffer = new char[len_sz + 1];
for (i=0; i < a.len_tmp ; i++)
resultat.buffer[i] = a.buffer[i];
for (i2=0 ; i < len_sz ; i++,i2++)
resultat.buffer[i] = b.buffer[i2];
resultat.buffer[len_sz] = '\0';
return Resultat;
}
car dans ta fonction tu ne désalloue pas buffer_sz.
11 déc. 2004 à 16:13
les "delete" ont été ajoutés sauf pour le destructeur, une erreur se produit lorsqu'on concatène 2 chaînes (opérateurs + et +=)
Sans le delete dans le destructeur, aucune erreur ne se produit.
11 déc. 2004 à 14:31
char* p = new char[50];
p = new char[30];
la, tu as perdu 50 octets, ils ne sont en effet plus référencé et il n'est plus possible de les liberer.
char* p = new char[50];
delete [] p;
p = new char[30];
la, c'est bon.
delete[] dans le destructeur aussi !
while(*b)
{
b++;
len_b++;
}
au lieu de faire ça, tu peux faire len_b = strlen(b);
tes typedef, ils polluent quand meme bien l'espace de nom global !
11 déc. 2004 à 13:32
tkx !
11 déc. 2004 à 13:28
pour les opérateurs +, +et, des fuites mémoires ? sur quoi faut il faire un delete ? peux tu expliquer comment les fuites de mémoire se produisent ?
tkx !
pour les typedef, c'est juste pour montrer leur utilisation.
11 déc. 2004 à 12:47
il manque le copy constructeur.
pour prendre la taille d'une chaine de caractere : strlen() de <cstring> (<string.h>), pour copier strcpy.
les operateurs +, +=, =, provoque des fuites memoires abominables ! Il faut faire un delete avant de réallouer !
et les typedef sstring, Sstring, ... c'est pas tres utile amha.