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