Tokeniser [Résolu]

Messages postés
69
Date d'inscription
lundi 10 février 2003
Statut
Membre
Dernière intervention
29 août 2012
- - Dernière réponse : PADYVEN
Messages postés
69
Date d'inscription
lundi 10 février 2003
Statut
Membre
Dernière intervention
29 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;
}
Afficher la suite 
A voir également:

Votre réponse

3 réponses

Meilleure réponse
Messages postés
69
Date d'inscription
lundi 10 février 2003
Statut
Membre
Dernière intervention
29 août 2012
3
Merci
Erreur résolue elle était caché ici

//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);
}

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 139 internautes nous ont dit merci ce mois-ci

Commenter la réponse de PADYVEN
Messages postés
14504
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
20 mai 2019
126
0
Merci
Hello,
Pour la 1ère question, utilise clear().
Pour la 2nde...euh...il me semble que le SIGTRAP signale que ton appli a atteint un point d'arrêt.


@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
Messages postés
69
Date d'inscription
lundi 10 février 2003
Statut
Membre
Dernière intervention
29 août 2012
0
Merci
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
             }
         }
      }
  }
Commenter la réponse de PADYVEN

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.