Hi Matt, the problem is in the byte code compiler of CINT. Run the example without byte code optimization (.O0) and it works. The problem is caused by creating the TIter next_file() object on the stack. It will work if you create the next_file iter on the heap: TIter *next_file = new TIter(files); while ((name2 = dynamic_cast< TObjString* >( next_file->Next() ) ) != 0) cout << name2->String() << endl; delete next_file; I hope Masa will fix or elaborate on the problem as soon as he is back from his business trip. Cheers, Fons. "Matthew D. Langston" wrote: > > There is a bug in TMap and TObjArray in ROOT 2.24.05. I can't be any > more specific that this, because the error message printed by ROOT is > meaningless (i.e. the ubiquitous "segmentation violation" message). > > I have, however, attached a file named CollectionBug.cxx which > reproduces the bug. The bug is only present when CollectionBug.cxx is > interpreted by ROOT. It runs fine when compiled. > > Here is the output from ROOT: > > root [0] .L CollectionBug.cxx > root [1] CollectionBug bug; > root [2] bug.Print(); > baz > foo > bar > > *** Break *** segmentation violation > Root > Function Print() busy flag cleared > > Regards, Matt > > > -- > Matthew D. Langston > SLD, Stanford Linear Accelerator Center > langston@SLAC.Stanford.EDU > > -------------------------------------------------------------------------------- > #ifndef __CINT__ > #include <TObjString.h> > #include <TObjArray.h> > #include <TMap.h> > #include <iostream> > #endif > > class CollectionBug > { > public: > > CollectionBug(); > > void Print(); > > private: > > TMap* fMap; > }; > > #ifndef __CINT__ > int > main( int argc, char* argv[] ) > { > CollectionBug bug; > bug.Print(); > } > #endif > > CollectionBug::CollectionBug() > { > fMap = new TMap(); > TObjArray* files; > > files = new TObjArray(); > files->Add( new TObjString( "1" ) ); > fMap->Add( new TObjString( "foo" ), files ); > > files = new TObjArray(); > files->Add( new TObjString( "1" ) ); > fMap->Add( new TObjString( "bar" ), files ); > > files = new TObjArray(); > files->Add( new TObjString( "1" ) ); > fMap->Add( new TObjString( "baz" ), files ); > } > > > void > CollectionBug::Print() > { > TObjString* name; > TIter next_dataset( fMap ); > while ( ( name = dynamic_cast< TObjString* >( next_dataset() ) ) != 0 ) > { > cout << name->String() << endl; > TObjArray* files = dynamic_cast< TObjArray* >( fMap->GetValue( name ) ); > TIter next_file( files ); > } > } > > // Local variables: > // compile-command: "g++ `root-config --cflags --libs` -Wl,-rpath,$ROOTSYS/lib -Wall CollectionBug.cxx -o CollectionBug" > // End: -- Org: CERN, European Laboratory for Particle Physics. Mail: 1211 Geneve 23, Switzerland E-Mail: Fons.Rademakers@cern.ch Phone: +41 22 7679248 WWW: http://root.cern.ch/~rdm/ Fax: +41 22 7677910
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:26 MET