Re: storing histogramms

From: Rene Brun (Rene.Brun@cern.ch)
Date: Tue Feb 02 1999 - 09:06:02 MET


Florian Schopper wrote:
> 
> Dear Rooters,
> 
> we encountered a probably simple problem, which we couldn't find in
> the roottalk list, though.
> 
> When we allocate Histogramms with new in the constructor of MChip,
> and store the MChip class into a root-file,
> we get a segmentation violation error when accessing the restored
> histogramms.
> 
> Is it necessary to write a default constructor for MChip which allocates
> the histogramms again?
> 
>             thanks,
>                   Florian
> 
> class  MChip : public TObject
> {
> private:
> 
> TH1F   *CommonModeHist;
> TH1F   *NHitHist;
> 
> public:
>   MChip(){}
> 
>   MChip(Int_t nChannel, TString Appelation );
> 
> ClassDef(MChip,1)
> } ;
> 
> The Constructor looks something like that:
> 
> MChip::MChip(Int_t N, TString Appelation)
> {
> CommonModeHist  = new TH1F("CommonMode","CommonMode",50,-25.0,25.0);
>  CommonModeHist->SetDirectory(0);
>  NHitHist        = new TH1F("NHits","Number of Hits",10,0,10);
>  HitHist->SetDirectory(0);
> 
> }

Hi Florian,
All your classes must have a default constructor. This default
constructor is used by Root I/O in particular to create an instance
of a class before invoking its Streamer method when you read an object
from a file.
The default constructor should not internally allocate objects
or dynamic arrays. If you do so, you must be cautious in the
corresponding destructor.
Below, you will find a slightly modified example with the script
to create a shared lib.

Rene Brun

//----------script
rootcint -f cint.C -c MChip.h MChipLinkDef.h
g++ -fno-rtti -fno-exceptions -fPIC -I$ROOTSYS/include -c cint.C MChip.C
g++ -g -Wl,-soname,MChip.so -shared cint.o MChip.o -o MChip.so

//----------file MChip.h

#include <TNamed.h>
#include <TH1.h>
      
   class  MChip : public TObject
{
private:

TH1F   *CommonModeHist;
TH1F   *NHitHist;

public:
  MChip(){}
 
  MChip(Int_t nChannel, TString Appelation );

ClassDef(MChip,1)
} ;

//-----------file MChipLinkDef.h
#ifdef __CINT__

#pragma link off all globals;
#pragma link off all classes;
#pragma link off all functions;

#pragma link C++ class MChip;

#endif

//---------file MChip.C
#include "MChip.h"
   
   ClassImp(MChip)
   
MChip::MChip(Int_t N, TString Appelation)
{
CommonModeHist  = new TH1F("CommonMode","CommonMode",50,-25.0,25.0); 
 CommonModeHist->SetDirectory(0);
 NHitHist        = new TH1F("NHits","Number of Hits",10,0,10);
 NHitHist->SetDirectory(0);
 
}



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