Hi rooters, I would like to be able to store a TClonesArray of TStrings ( wrapped in TObjStrings ). Say I have a class which has a TClonesArray as a private member. I then add TObjStrings to this array during the lifetime of the object before writing it to a file. The code below is a simplified example which runs in ROOT/CINT. I do the following: root [0]> .L testfile.C root [1]> main() test line Ndata = 3 test one test two test three (Int_t)0 root [2] read() test line Ndata = 0 So, the array is built correctly but the data in the array isn't stored in the file... I'm probably missing something obvious about the ROOT I/O system. Suggestions? I'm using ROOT 2.25/00 under RH6.1 built from the CVS source using the linuxegcs option. --- class TESTLIST : public TObject { public: TESTLIST() { fdata = new TClonesArray("TObjString",10); fndata = 0; }; ~TESTLIST() { fdata->Delete(); }; void Add(TString l) { new ((*fdata)[fndata++]) TObjString(l); }; TObjString* At(Int_t i) { return (TObjString*)fdata->At(i); }; Int_t ndata() { return fndata; }; private: TClonesArray *fdata; Int_t fndata; }; Int_t main() { TESTLIST t; TObjString line("test line"); t.Add("test one"); t.Add("test two"); t.Add("test three"); cout << line->String() << endl; cout << "Ndata = " << t.ndata() << endl; for (Int_t i=0; i<t.ndata(); i++) cout << t.At(i).String() << endl; TFile *f = new TFile("test.root","RECREATE"); f->cd(); t.Write("mylist",TObject::kOverwrite); line.Write("myline",TObject::kOverwrite); f->Close(); delete f; return 0; } void read() { TFile *f = new TFile("test.root","READ"); TObjString *l = (TObjString*)f->Get("myline"); cout << l->String() << endl; TESTLIST *t = (TESTLIST*)f->Get("mylist"); cout << "Ndata = " << t->ndata() << endl; for (Int_t i=0; i<t.ndata(); i++) cout << t.At(i).String() << endl; }
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:29 MET