Hi Georges, On Mon, 23 Jul 2001 17:26:19 +0200 (CEST) Georges Lobo <lobo@irmm.jrc.be> wrote concerning ": [ROOT] Segmentation violation when reading a TMatrix object": > Hi rooters, > I have a small problem with the reading of a TMatrix object stored > in a file. > 1 > //example.C 2 > { 3 > f = new TFile("th232.root"); 4 > f->ls(); 5 > accordeon->Print(); 6 > for(int i=0;i<5;i++) 7 > cout << accordeon(i,0) << endl; 8 > } > > When I run the example I have a segmentation violation but I don't > understand why. It's probably because you're mixing things a bit. See, accordeon is a pointer, or at least you're using it as a pointer in line 5, by derefencing it with "->". However, in line 7 you're using it as an object, by (presumably) sending the message TMatrixD::operator()(Int_t i, Int_t j). But, since accordeon is a pointer, line 7 is not understood as the message above, but probably as an initialisation, so in fact you've changed the size of accordion to 1x0, or something like that. To send that message, you _must_ do 7' cout << accordeon->operator()(i, 0) << endl; Here's a small example I ran: prompt% root root [0] TFile* file = new TFile("foo.root", "RECREATE") root [1] TMatrixD a(5, 2) root [2] for (Int_t i = 0; i < 5; i++) a(i, 0) = i root [3] for (Int_t i = 0; i < 5; i++) a(i, 1) = i * 10 root [4] a.Print() Matrix 5x2 is as follows | 0 | 1 | ------------------------------------------------------------------ 0 | 0 0 1 | 1 10 2 | 2 20 3 | 3 30 4 | 4 40 root [5] a.Write("a") (Int_t)186 root [6] file->Write() (Int_t)0 root [7] file->Close() root [8] .q And then prompt% root root [0] TFile* file = TFile::Open("foo.root") root [1] gDirectory->ls() TFile** foo.root TFile* foo.root KEY: TMatrixD a;1 Matrix class (double precision) root [2] a (const class TMatrixD*const)0x8694630 root [3] a->Print() Matrix 5x2 is as follows | 0 | 1 | ------------------------------------------------------------------ 0 | 0 0 1 | 1 10 2 | 2 20 3 | 3 30 4 | 4 40 root [4] for (Int_t i = 0; i < 5; i++) cout << a->operator()(i,0) << endl 0 1 2 3 4 root [5] for (Int_t i = 0; i < 5; i++) cout << a(i,0) << endl 0 *** Break *** segmentation violation Root > .q As you see in line [2] above, a is indeed a pointer to a TMatrixD object, not a reference or an object, so you are forced to use the explicit message operator()(Int_t i, Int_t j) as in line [4] above. The fact that CINT unfortunatly allows you to mix and mingle "." and "->" should not prompt you to pursue that bad habit. Always use "->" for pointers and "." for references or objects. Do not mix the two - it'll cause you more trouble in the end. Yours, Christian ----------------------------------------------------------- Holm Christensen Phone: (+45) 35 35 96 91 Sankt Hansgade 23, 1. th. Office: (+45) 353 25 305 DK-2200 Copenhagen N Web: www.nbi.dk/~cholm Denmark Email: cholm@nbi.dk
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:52 MET