Re: [ROOT] compiler warning

From: cstrato (cstrato@aon.at)
Date: Tue Jun 08 2004 - 20:17:02 MEST


Dear Eddy

Thank you for this suggestion. The possibility to use
different tokens opens quite some new possibilities for me.

Best regards
Christian

Edmond Offermann wrote:

> Hi Christian,
> 
> I did not follow the whole discussion but if you
> want to split a character string into pieces using
> a bunch of delimiters , TString::Tokenize is the
> way to go:
> 
> Suppose, you have the following code with the input:
> "option = "myopt1:myopt2"
> 
> MyFunction(const char *option)
> {
>   const TString opt = option;
>   TObjArray *strL = opt.Tokenize(":");
>   const TString opt1 = ((TObjString
> *)strL->At(0))->GetString();
>   const TString opt2 = ((TObjString
> *)strL->At(1))->GetString());
> 
>   delete strL;
> }
> 
> The delimiter list can be a list of characters:
> 
> TString bla = "aap+noot-mies";
> TObjArray *strL = bla.Tokenize("+-");
> 
> Now the TObjeString list strL will contain
> "aap","noot" and "mies" in the positions 0,1 and 2
> resp.
> 
> Eddy
> 
> 
> --- Valeri Fine <fine@bnl.gov> wrote:
> 
>>Hello Christian,
>>
>>  You STILL have a problem
>>  The pointer your new operator returns
>>
>>  char *opt  = new char[csize];
>>
>>  and the pointer you want to use to delete that
>>array MUST match
>>
>> However your statement 
>>
>>
>>>       opt = strtok(NULL, ":");
>>
>>does change the pointer "opt" and by this reason you
>>can not make free
>>the memory allocated with the "new"
>> 
>>
>>You can have avoid that if you use your "opt",
>>"opt1", opt2" solely to
>>create and delete. Use other variables for all
>>internal operations and
>>you will be safe (may be :-)
>>
>>Of course you may research some  other ways like the
>>STL "string" class
>>or Qt QString::section(. . .) to do what you want
>>http://doc.trolltech.com/3.3/qstring.html#section )
>>
>>  Best regards, Valeri
>>
>>
>>>Dear all
>>>
>>>Thank you all for giving me some more information.
>>>
>>>Sorrowly, Victor´s statement is really bad news.
>>>Is the following code allowed in other compilers:
>>>    const Int_t kBufSize = 512; //in global space
>>>    char option[kBufSize];  // in different
>>
>>functions
>>
>>>To reply to Valeri:
>>>Suppose, I have the following code with the input:
>>>    "options = "myopt1:myopt2"
>>>
>>>    MyFunction(const char *option)
>>>    {
>>>       Int_t csize = strlen(options) + 1;
>>>       char *opt  = new char[csize];
>>>       char *opt1 = new char[csize];
>>>       char *opt2 = new char[csize];
>>>
>>>       opt = strtok(strcpy(opt, options),":");
>>>       opt1 = strcpy(opt1, opt);
>>>
>>>       opt = strtok(NULL, ":");
>>>       opt2 = strcpy(opt2, opt);
>>>
>>>       myClass->MyMethod(opt1, opt2)
>>>       {
>>>          fString1 = opt1;   //TString fString1;
>>>          fString2 = opt2;   //TString fString2;
>>>       }
>>>
>>>       delete [] opt2;
>>>       delete [] opt1;
>>>       delete [] opt;
>>>    }
>>>Is this code safe as long as I use TString and not
>>
>>char?
>>
>>>BTW, this is the reason, why I always hated C
>>
>>which I
>>
>>>have never used, and why I try to use the TString
>>
>>class
>>
>>>whenever possible, :-)
>>>
>>>Best regards
>>>Christian



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:08 MET