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
> >
> >
> > Victor Perevoztchikov wrote:
> >
> > > In addition to Valery, construction
> > >
> > >>> char option[csize];
> > >
> > > allowed only in gcc.
> > >
> > > Victor
> > >
> > > Victor M. Perevoztchikov perev@bnl.gov
> > > Brookhaven National Laboratory MS 510A PO Box
> 5000 Upton NY
> 11973-5000
> > > tel office : 631-344-7894; fax 631-344-4206;
> > >
> > > ----- Original Message -----
> > > From: "Valeri Fine" <fine@bnl.gov>
> > > To: "'cstrato'" <cstrato@aon.at>; "'Elias
> Athanasopoulos'"
> > > <elathan@phys.uoa.gr>
> > > Cc: <roottalk@pcroot.cern.ch>
> > > Sent: Sunday, June 06, 2004 5:47 PM
> > > Subject: RE: [ROOT] compiler warning
> > >
> > >
> > >
> > >>>Dear Elias, dear Valeri
> > >>>
> > >>>Thank you for your explanation.
> > >>>I have now solved the problem by using:
> > >>> Int_t csize = strlen(opt) + 1;
> > >>> char option[csize];
> > >>>
> > >>
> > >>[Valeri Fine]
> > >> Let me call your attention that your solution
> is still error prone
> > >>
> > >> You allocated the needed space on stack.
> > >> This means the space will be automatically
> de-allocated and (it can
> be
> > >>allocated for other purpose) as soon as your
> code leaves the
> "option"
> > >>variable scope. Because you did not provide your
> source I have no
> clue
> > >>what this scope is. May be it is what you wanted
> . . .
> > >>
> > >>
> > >>>I hope that this does not only work with gcc
> but also with
> > >>>other compilers.
> > >>
> > >>[Valeri Fine]
> > >>I hope thee smart compiler will warn as soon as
> you try using this
> > >>variable out of scope, however the smart guy
> always can defeat any
> > >>compiler :-)
> > >>
> > >>Hope this helps.
> > >>
> > >>
> > >>>Best regards
> > >>>Christian
> > >>>
> > >>>
> > >>>Valeri Fine wrote:
> > >>>
> > >>>
> > >>>>Hello Christian
> > >>>>
> > >>>>
> > >>>>
> > >>>>
> > >>>>>Dear Rooters
> > >>>>>
> > >>>>>I apologize for a simple non-root question,
> but sorrowly I have
> > >>>>>nobody else to ask:
> > >>>>>Sometimes I have statements such as the
> following:
> > >>>>> if (strcmp(name, "option") == 0) {
> > >>>>> char *option;
> > >>>>> option = strcpy(option, opt);
> > >>>>> }
> > >>>>>
> > >>>>>Although it is correct, I get the following
> compiler warning:
> > >>>>>"warning: `char*option' might be used
> uninitialized in this
> > >>
> > >>function"
> > >>
> > >>>>
> > >>>>[Valeri Fine] It looks like the compiler
> pointed you to your bug
> to
> > >>
> > >>be
> > >>
> > >>>>fixed. That must lead to the memory
> corruption. "strcpy" alone
> > >>>>allocates NO extra memory.
> > >>>>
> > >>>>
> > >>>>
> > >>>>
> > >>>>>How can I prevent such compiler warnings?
> > >>>>
> > >>>>[Valeri Fine]
> > >>>>
> > >>>>
> > >>>>>Would it be save to write:
> > >>>>> char *option = "";
>
=== message truncated ===
This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:08 MET