We have discovered a problem with Cint. In our code we defined a pointer to C structure as follows: g2t_hits_st *row; we expected: int(row+1) - int(row) = sizeof(g2t_hits_st) But in real ROOT/Cint session we found root4star [20] int(row+1) - int(row) (const int)60 root4star [14] sizeof(g2t_tpc_hit_st) (int)52 As result the "for" loop over the array of that struct was screw up: for (int i=0;i<n;i++,row++) { . . . } Note: the array was allocated by "compiled" code and the real sizeof() is very 52 bytes. We tried to reproduce this with a simple macro: { struct g2t_tpc_hit_st { long id; long next_tr_hit_p; long track_p; long volume_id; float de; float ds; float p[3]; float tof; float x[3]; }; g2t_tpc_hit_st r; g2t_tpc_hit_st *row = &r; printf("sizeof(*row) = %d ;sizeof(g2t_tpc_hit_st) \n",sizeof(*row),sizeof(g2t_tpc_hit_st)); printf("(row+1)=%d;(row)=%d , diff = %d\n",int(row+1),int(row),int(row+1)-int(row)); } and got: root [3] .x size.C sizeof(*row) = 56 ;sizeof(g2t_tpc_hit_st) (row+1)=5493400;(row)=5493344 root [4] .x size.C sizeof(*row) = 56 ;sizeof(g2t_tpc_hit_st) (row+1)=5493400;(row)=5493344 , diff = 56 The same code been compiled with VC++ gives: sizeof(*row) = 52 ;sizeof(g2t_tpc_hit_st) (row+1)=1245052;(row)=1245000 , diff = 52 Sun: sizeof(*row) = 52 ;sizeof(g2t_tpc_hit_st) (row+1)=1245052;(row)=1245000 , diff = 52 Linux g++: [rcas6025] ~/expert > a.out sizeof(*row) = 52 ;sizeof(g2t_tpc_hit_st) (row+1)=-1073747128;(row)=-1073747180 , diff = 52 Is it a bug or feature ? Valery root4star [15] row (struct g2t_hits_st*)0x9748c7c root4star [16] row++ (struct g2t_hits_st*)0x9748c7c root4star [17] row (struct g2t_hits_st*)0x9748cb8 root4star [18] 0x9748cb8-0x9748c7c (const int)60 root4star [19] ================================================================= Dr. Valeri Faine (Fine) ------------------- Phone: +1 516 344 7806 Brookhaven National Laboratory FAX : +1 516 344 4206 Bldg. 510A /STAR mailto:fine@bnl.gov Upton, New York, 11973-5000 http://nicewww.cern.ch/~fine USA Dr. Valery Fine Telex : 911621 dubna su ----------- LCTA/Joint Inst.for Nuclear Res. Phone : +7 09621 6 40 80 141980 Dubna, Moscow region Fax : +7 09621 6 51 45 Russia mailto:fine@main1.jinr.dubna.su
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:26 MET