George,
Replace Int_t** a by Int_t **a
Masa has already fixed this problem.
Rene Brun
George Heintzelman wrote:
>
> Hi,
>
> It looks like CINT has trouble understanding pointer-to-pointer types
> for member functions, although the return values appear to work
> correctly if casted right. Raw data members work correctly, though
> typedefs of pointer types cause additional difficulties. An example
> follows:
>
> test_ptop.h
> ---------------
> #ifndef _test_ptop_h_
> #define _test_ptop_h_
>
> typedef Int_t *pint;
>
> class X {
> public:
> Int_t** a; //!
> pint* b; //!
>
> Int_t** A() {return a;}
> pint* B() {return b;}
>
> X(Int_t *&ia , Int_t *&ib ): a(&ia),b(&ib) {}
>
> ClassDef(X,1)
>
> };
>
> #endif
>
> ---------------
> test_ptop.cxx
> ---------------
> #include "Rtypes.h"
> #include "test_ptop.h"
>
> ClassImp(X)
>
> ---------------
> LinkDef.h
> ---------------
> #ifdef __CINT__
>
> #pragma link off all globals;
> #pragma link off all classes;
> #pragma link off all functions;
>
> #pragma link C++ class X;
> #pragma link typedef pint;
> // #pragma link C++ class Temp<int>-; // works fine
> #endif
> ---------------
> Run example: (Linux system, running root 2.23/10)
> rcas4008 % g++ -I$ROOTSYS/include -c test_ptop.cxx
> rcas4008 % rootcint -f TestCint.cxx -c test_ptop.h LinkDef.h
> Note: operator new() masked 1c
> Note: operator delete() masked 1c
> class X in test_ptop.h line 6 original base of virtual func
> rcas4008 % g++ -I$ROOTSYS/include -c TestCint.cxx
> rcas4008 % g++ -shared -Wl -o Test.so TestCint.o test_ptop.o
> rcas4008 % root
> *******************************************
> * *
> * W E L C O M E to R O O T *
> * *
> * Version 2.23/10 17 December 1999 *
> * *
> * You are welcome to visit our Web site *
> * http://root.cern.ch *
> * *
> *******************************************
>
> FreeType Engine v1.1 used to render TrueType fonts.
>
> CINT/ROOT C/C++ Interpreter version 5.14.25, Nov 25 1999
> Type ? for help. Commands must be C++ statements.
> Enclose multiple statements between { }.
> root [0] .L Test.so
> root [1] Int_t x=5
> root [2] Int_t y=6
> root [3] Int_t *px=&x
> root [4] Int_t *py=&y
> root [5] X obj(px,py)
> root [6] obj.A()
> (Int_t*)0x85ff4e8 ****** Wrong type. Should be Int_t**.
> root [7] *(obj.A())
> (Int_t)140493664 ****** Wrong type. Should be Int_t*.
> root [8] **((Int_t **)obj.A())
> (Int_t)5
> root [9] obj.B()
> (pint)0x85ff490 ****** Wrong type. Should be pint *.
> root [10] *obj.B()
> (int)140493696 ****** Wrong type. Should be pint or
> Int_t *
> root [11] **((pint *)obj.B())
> Error: Illegal pointer operation (tovalue) FILE:/tmp/29991laa_cint
> LINE:1
> Error: Illegal pointer operation (tovalue) FILE:/tmp/29991laa_cint
> LINE:1
> ((unknown))0x85ff490
> *** Interpreter error recovered ***
> root [12] *((pint *)obj.B())
> Error: Illegal pointer operation (tovalue) FILE:/tmp/29991maa_cint
> LINE:1
> ((unknown))0x85ff490
> *** Interpreter error recovered ***
> root [13] obj.a
> (Int_t**)0x85ff4e8 ****** This one works right.
> root [14] obj.b
> Warning: Unknown type 'unknown' in function argument handled as int
> FILE:iostream.h LINE:521
> Internal error: template function call G__ateval failed FILE: LINE:0
> (pint*)0x85ff490
> *** Interpreter error recovered ***
> root [16] **((Int_t **)obj.B())
> (Int_t)6 **** Can only get there by casting
> to
> the explicit pointer'd type.
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:17 MET