Hi Alexander
I think your problem comes from using interpreted script rather than
compiling.
The interpreter lets you get away with all sorts of crimes without
saying anything
until at some point it just blows up...and you have no idea why.
Judging from the code you sent, as the necessary #include directives are
missing,
I think it's a safe bet that you never tried to compile your class.
If you did, then you would find that your class is not valid - it has no
ctor or dtor!
Therefore the line
Test* test=new Test();
has little chance of compiling, and I hate to imagine what the
interpreter may have got
up to when it went through this.... ;-)
Also, you declare a pointer
TTree* t4
and then access its methods using
t4.Fill()
Will not compile, but the interpreter just carries on regardless...
Finally,
void main(void)
is not a valid declaration for main, which must have "int" return type.
Once again, the ACLiC compiler points out these problems straight
away, whereas CINT just doesn't seem to care.
Try the following: first, modify the header for your class:
Test.hh:
----------------------------------------------------
#include "TObject.h"
class DietzTest :public TObject {
public:
Int_t fTest;
DietzTest();
virtual ~DietzTest();
ClassDef(DietzTest,1)
};
-------------------------------------------------------
and create an implementation file Test.C:
---------------------------------------------------------
#include "Test.hh"
ClassImp(Test)
///////////////////////////////////////////////////////
// Test
//
// Remarkably succinct yet informative
// description for HTML documentation
//
////////////////////////////////////////////////////////
DietzTest::DietzTest()
{
//default ctor
//does nothing but must be present
}
DietzTest::~DietzTest()
{
//dtor
//ditto and ditto again
}
-------------------------------------------------------------------
Now modify your "main" programme main.C:
-------------------------------------------------------------------
#include "Test.hh"
#include "TFile.h"
#include "TTree.h"
#include "TRandom.h"
int Dmain(void)
{
// creating new TFile
TFile* f=new TFile("tree4.root","RECREATE");
// creating new TTree
TTree* t4=new TTree("t4","tree");
// pointer to new Object
Test* test=new Test();
// creating new branch
t4->Branch("test","Test",&test, 16000,2);
// filling tree with random values
for (int ev=0;ev<100;ev++) {
Int_t value=int(gRandom->Rndm()*100);
test->fTest=value;
t4->Fill();
}
f->Write();
f->Close();
return 0;
}
-------------------------------------------------------------------------------
** Notice that I renamed "main" as "Dmain" - because otherwise after
compiling and charging
** the shared lib, CINT did not recognise "main()" whereas "Dmain()"
works fine - does anyone
** know why ?
OK, now all you have to do is to compile and load your class by typing
.L Test.C+
and then do the same for the main program
.L main.C+
and if you type
Dmain()
you'll see that it works - or at least it worked for me!!!
If you follow this prescription for adding your own classes to ROOT you
shouldn't have too many
problems, and if you use the compiler you should find it easier to know
when things aren't going
too well!
Hope this helps
Good luck ;-)
--
John D. Frankland
Beam Coordinator
GANIL
B.P. 55027
14076 CAEN Cedex 05
tel: +33 (0)231454628
fax: +33 (0)231454665
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:12 MET