Hi Valeri, this bug has already been fixed in our development version. A work around is to set in your .rootrc: Root.ObjectStat: 1. Or to apply the following fix to the CONT_HashTable.cxx file, in "THashTable::Rehash()" change the line: if (checkObjValidity && gObjectTable) { to if (checkObjValidity && TObject::GetObjectStat() && gObjectTable) { Cheers, Fons. Tioukov Valeri wrote: > > Hi rooters, > > I found that the last Rehash() of the hashtable othen is really last: the > table becomes broken. > > As the shortest example Test_THashTable from tcollex.cxx with 4 edited > lines (marked VT:) : > > ................................................................................. > void Test_THashTable() > { > Printf( > "////////////////////////////////////////////////////////////////\n" > "// Test of THashTable //\n" > "////////////////////////////////////////////////////////////////" > ); > > int i; > > // Create a hash table with an initial size of 20 (actually the nextprime > // above 20). No automatic rehashing. > THashTable ht(20); > > Printf("Filling THashTable"); > Printf("Number of slots before filling: %d", ht.Capacity()); > for (i = 0; i < 100; i++) // VT: change loop to 100 > ht.Add(new TObjNum(i)); // VT: TObjNum instead TObject > > ht.Print(); // VT: printed ok > > Printf("Average collisions: %f", ht.AverageCollisions()); > > // rehash the hash table to reduce the collission rate > ht.Rehash(ht.GetSize()); > > ht.Print(); // VT: print 1 empty line > > Printf("Number of slots after rehash: %d", ht.Capacity()); > Printf("Average collisions after rehash: %f", ht.AverageCollisions()); > ................................................................................ > > In fact after the last rehash nothing works also in my programs. > Moreother if I declare table with the automatic rehash > THashTable ht(100,10); for example - the effect depends dramatically on > the parameters > > The next code I add to tcollex.cxx as one more example: > > void Test_T() > { > TObjNum *x=0, *y=0; > > THashTable *h = new THashTable(100,10); > > for(int i=0; i<2000; i++) { > x = new TObjNum(i); > h->Add(x); > } > > y = new TObjNum(10); > ((TObjNum*)h->FindObject(y))->Print(""); // 1 > > printf("%f \n", h->AverageCollisions()); > h->Rehash(h->GetSize()); > printf("%f \n", h->AverageCollisions()); > > h->Print(); // 2 > ((TObjNum*)h->FindObject(y))->Print(""); // 3 > } > > This code brakes at line // 1 . If one change the table declaration to > THashTable(100,20); or reduce the cycle to 200 - it works up to line //2. > Line //3 brakes anyway. > > Is it a bug or I do something wrong? > I tested it only on one system RH5.2+egcs-1.0.3 > > Best regards > Valeri -- 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 04 2000 - 00:43:32 MET