Interesting Behavior from "equivalent" statements...

From: Pasha Murat (murat@cdfsga.fnal.gov)
Date: Wed Dec 31 1997 - 18:21:19 MET


Tim Miller writes:
 > Actually there are 2 strange behaviors.  The first (brief)
 > one is this:
 > 
 >      TRQMD FileList = new TRQMD(filename,10);
 >      (FileList+0)->function(); // Root Seg fault
 >      TRQMD *temp = FileList + 0; temp->function(); // Root ok
 > 

	Hi Tim,

as your `FileList' var is a pointer you should type

TRQMD* FileList = new TRQMD(filename,10);
     ^
For me this looks like an argument for CINT not to allow "extentions" to C++. 
May be Masaharu could comment more on this.

I also suspect that your second problem is of the same nature: if you are not
reassigning the value of the pointer (which presumably is *not* declared as
a pointer) everything is OK.
					Regards, Pasha.

--------------------------------------------------------------------------------
 > The second strange behavior is more complicated....
 > 
 > Background:  I've compiled my own "dll" (.so for linux)
 > with 3 classes to use for my research.  Since this is
 > my first real attempt at classes (I'm mainly a C guy),
 > the heirarchy may not be the greatest (*shrug*).  One 
 > class for the file (and an array of pointers to the 
 > events in the file), one class for the event (with an 
 > array of pointers to the particles), and one class for
 > the particles (with Int_t and Float_t for 4P, mass, and
 > PID).
 > 
 > The best way I can describe the problem is thus (and this
 > may be a generic C++ thing, for which I apologize for my
 > newbie-ness):
 >    A Class created by 
 >         Files = new TRQMD[NumFiles];
 >    with a subsequent call to the overloaded constructor
 >         TRQMD *TempRQMD = Files + x;  // x is loop var
 >         TempRQMD->TRQMD(filename, NumEvents);
 > 
 >    does *NOT* work the same as:
 >         TRQMD *File = new TRQMD(filename, NumEvents);
 >    assuming NumFiles == 1 above.
 > 
 > Now, here is the funny part:  Both code sequences ACTUALLY
 > read the file as it should!!!!(in the TRQMD(char *,int) call)
 > However, when I try to access the TempRQMD class functions, 
 > they return member values that were set with TRQMD() despite the
 > TRQMD(filename, NumEvents) call.  Lemme illustrate with the
 > command line entries that I got from root:
 > 
 >      gSystem.Load("stage1.so");  
 >      FileList = new TRQMD[1];  // Same results is no [1]
 >      TRQMD *TempRQMD = FileList;
 >      TempRQMD->TRQMD("central-500evts-1.ascii", 10);
 >         //  Normal output from the function returning the
 >         //  Correct values read from the file
 >      TempRQMD->GetEvents()  // Should return 10...as passed in prev.
 > 	-->Root returns this: (Int_t)(-1)
 >         -->Which is the value set by TRQMD() (from new construction)
 > 
 > However, this is the alternate output:
 >      gSystem.Load("stage1.so");
 >      FileList = new TRQMD("central-500evts-1.ascii", 10);
 >      FileList->GetEvents()
 >         -->Root returns this:  (Int_t)10  // This is right!
 > 
 > Ok, as promised, here is some source code:
 > 
 > (This is from TRQMD.cxx)
 > TRQMD::TRQMD() {
 >      fTotalEvents = -1;
 >      fEventList = 0;
 > }
 > 
 > TRQMD::TRQMD(Char_t *filename, Int_t eventnum) {
 >      // Some temp var declarations omitted
 > 
 >      fTotalEvents = eventnum;
 > 
 >      cout << "Eventnumber is " << fTotalEvents << endl;
 >         //  In root this prints out as 10!!!!
 > 
 > 
 >      // rest of file read in code removed.
 > } 
 > 
 > 
 > 
 > -- 
 > ~~ WWW Page:  http://quantum.phy.vanderbilt.edu/~tim/ ~~
 > Tim Miller                   |  "Am I mature enough to get old?"
 >    Vanderbilt University     |                  --Me.
 >  Graduate Studies in Physics |
 >    Relativistic Heavy Ions   |
 > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:26:23 MET