PADYVEN
Messages postés69Date d'inscriptionlundi 10 février 2003StatutMembreDernière intervention29 août 2012
-
27 août 2012 à 23:47
PADYVEN
Messages postés69Date d'inscriptionlundi 10 février 2003StatutMembreDernière intervention29 août 2012
-
29 août 2012 à 08:21
Bonjour a tous,
voila je code un petit Tokenizer en c++ pour m'entrainer sur les char* et les pointeurs.
je n'utilise volontairement pas les string.
-j'ai à l'heure actuel deux problèmes je ne sais pas écrire la fonction pour vider mon vector<char *>
si vous pouvez me fournir de l'aide?
-lorsque j'exécute mon code tout vas bien mais lorsque je le lance avec gdb un signal sigtrap apparait.
mais je ne trouve pas l'erreur.je suis presque sure que c un pb de pointeur mais où
voici le code de la fonction
toutes les autres fonctions permet de reconnaitre une catégorie de token ex:is_DblOper(Ptr) renvoie 1 si ">=" "<="
int TK_LoadEval::Str_GetToken(char *ChaineStr,std::vector <char *> &ListeToken)
{//parcours la chaine et la transforme en token
if (ChaineStr)
{ //Init
char *Ptr=ChaineStr;
int SizeStr=strlen(ChaineStr);
if (SizeStr)
{//si pas chaine vide
//Str_DelToken(&ListeToken);
ListeToken.clear();
ListeToken.reserve(SizeStr/2); //nettoie le vecteur et reserve la motie de la taille de la chaine
char *BufferCpy=(char *)calloc(SizeStr,sizeof(char));
char *ptrBuf=BufferCpy;
if (BufferCpy)
{//allocation reussie
while (*Ptr!=0)
{//pour tous les caracteres
if (!isspace(*Ptr))
{//c'est pas un blanc
if (!is_ProgSepar(*Ptr)) {*ptrBuf=*Ptr;ptrBuf++;} //pas un separateur
else //c'est un separateur
{ //on copie le buffer si present
if ((*BufferCpy)!=0)
{//le buffer n'est pas vide
*ptrBuf=0;
char *Chaine=(char *)calloc(strlen(BufferCpy)+1,sizeof(char));
memcpy(Chaine,BufferCpy,strlen(BufferCpy));
ListeToken.push_back(Chaine);
memset(BufferCpy,0,strlen(BufferCpy));ptrBuf=BufferCpy;
}
//on copie l'opérande
if (is_DblOper(Ptr))
{
char *Chaine=(char *)calloc(3,sizeof(char));
memcpy(Chaine,Ptr,2);Chaine[2]=0;
ListeToken.push_back(Chaine);
}
else
{
char *Chaine=(char *)calloc(2,sizeof(char));
memcpy(Chaine,Ptr,1);Chaine[1]=0;
ListeToken.push_back(Chaine);
}
}
}
else
{//c'est un blanc
if ((*BufferCpy)!=0)
{//le buffer n'est pas vide
*ptrBuf=0;
char *Chaine=(char *)calloc(strlen(BufferCpy)+1,sizeof(char));
memcpy(Chaine,BufferCpy,strlen(BufferCpy));
ListeToken.push_back(Chaine);
memset(BufferCpy,0,strlen(BufferCpy));ptrBuf=BufferCpy;
}
}
Ptr++;
}
//dernier item
if ((*BufferCpy)!=0)
{//le buffer n'est pas vide
*ptrBuf=0;
char *Chaine=(char *)calloc(strlen(BufferCpy)+1,sizeof(char));
memcpy(Chaine,BufferCpy,strlen(BufferCpy));
ListeToken.push_back(Chaine);
memset(BufferCpy,0,strlen(BufferCpy));
}
free(BufferCpy);
int tt=0;
fprintf(stdout,"Ligne: ' %s '\n\t< %s >" , ChaineStr,ListeToken[0] );
for (tt=1;tt<ListeToken.size();tt++) {fprintf(stdout,",< %s >",ListeToken[tt]);}
fprintf(stdout,"\n");
return 1;
}
}
}
return 0;
}
PADYVEN
Messages postés69Date d'inscriptionlundi 10 février 2003StatutMembreDernière intervention29 août 2012 29 août 2012 à 03:05
Merci d'avoir pris le temps de me répondre.
le deuxième message est problématique pour moi car il n'y a pas de points d'arrêt dans le programme, donc je pense qu'il y a une faille dans mon code c'est pour cela que je l'ai posté en espérant que vous puissiez y voir quelque chose que j'aurais loupé.
pour la première question: est ce que ceci est correct. (j'ai crée le char* avec calloc donc je dois utilisé free()? )
void EffacerTblItem (std::vector <char *> *ListeToken)
{//efface les allocations de la liste
if (ListeToken)
{
if (ListeToken.size())
{
int i=0;char *Temp=NULL;
for (i=0;i<ListeToken.size;i++)
{
temp=ListeToken->back():
ListeToken->pop_back();
if (temp) free(temp); //ou peut être delete
}
}
}
}