[ROOT] variable 2-dim array in a class for root I/O

From: Hajime Nanjyo (nanjyo@icepp.s.u-tokyo.ac.jp)
Date: Thu Jul 24 2003 - 23:10:48 MEST


Dear Rooters,

I would like to use a 2-dim. array of variable size
within a class which is used for ROOT I/O.

Some simple codes are listed below to show what I want to do.
(A 2-dim. array is declared in MyClass.h.)

These codes were compiled successfully and the application
run without error. But the 2-dim. array was not stored
in the ROOT file.

I'm afraid the expression, "double   (*pp)[2];//[size]" ,
is not supported.
Could you tell me how to do ?

Best Regards,
Hajime

////////////////////////////////
g++ `root-config --cflags` -c MyClass.C
rootcint -f MyClassDict.C -c MyClass.h MyClassLinkDef.h
g++ `root-config --cflags` -c MyClassDict.C
g++ -shared -O MyClass.o MyClassDict.o -o  libMyClass.so 
g++ `root-config --cflags` -c write.C
g++ write.o libMyClass.so `root-config --libs` -o write
./write



////////////////////////////////
// MyClass.h
#ifndef MyClass_HH
#define MyClass_HH

#include "TObject.h"

class  MyClass: public TObject
{
 public:
  MyClass();
  ~MyClass();
  void Init(int s);
  void Fin();

 public:
  int      size;
  double   *p;//[size]
  double   (*pp)[2];//[size]
  //       ^^^^^^^^^^^^^^^^
  //  such kind of expression is supported?

  ClassDef(MyClass,1) //MyClass
};

#endif
////////////////////////////////
// MyClass.C
#include "MyClass.h"
#if !defined(__CINT__)
ClassImp(MyClass);
#endif
MyClass::MyClass() {
  size=0;
  p=0;
  pp=0;
}

MyClass::~MyClass() {
  ;
}


void MyClass::Init(int s) {
  size=s;
  p  = new double[s];
  pp = new double[s][2];
}

void MyClass::Fin() {
  delete [] p;
  delete [] pp;
  
  p=0;
  pp=0;
  size=0;
}
////////////////////////////////
// MyClassLinkDef.h
#ifdef __CINT__
#pragma link off all globals;
#pragma link off all classes;
#pragma link off all functions;
#pragma link C++ class MyClass+;


#endif
////////////////////////////////
// write.C
#include "TApplication.h"
#include "TFile.h"
#include "TTree.h"
#include "MyClass.h"

int main(int argc,char** argv)
{
  TApplication app("app", &argc, argv);
  TFile *tf = new TFile("tmp.root","RECREATE");
  TTree *tree = new TTree("tree","tmp");

  MyClass *data = new MyClass();
  tree->Branch("data","MyClass",&data);

  for (int i=0;i<5;++i) {
    data->Init(i+1);
    for(int j=0;j<data->size;j++) {
      data->p[j] = j*10.+i;
      data->pp[j][0] = j*10.+i;
      data->pp[j][1] = j*10.+i+1;
    }
    tree->Fill();
    data->Fin();
  }

  tf->Write();
  delete data;

  return 0;
}
////////////////////////////////



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:13 MET