Hi Eddy,
Your program crashes because you try to read a non-existing Tree.
If you replace the line :
TTree *tr = (TTree*)gDirectory->Get("trades");
by
TTree *tr = (TTree*)gDirectory->Get("tree");
your loop reading the Tree will run correctly.
However when running your program, I see that you are hitting a particular case
where the friend Tree is defined in the creation program but not used at all
in the reading program. In this particular case, there was a problem
when deleting the Tree with friends at the end of your example.
I have fixed this problem in the development version (source and binaries).
Rene Brun
Eddy Offermann wrote:
>
> Hi Rene,
>
> I seem not to be able to get the AddFriend() in tree going.
> In the example below, I create two tree's. In the first
> one I make a friend of the second one. Later when opening
> the seconf the program segv.
>
> I ran this on SunOS 2.6 with gcc2.9.5 with a CVS version of a week
> ago.
>
> Could you please have a look,
>
> Best Regards, Eddy
>
> Starting program: /work/eddy/kk3/src/tree/doit
> Filling tree
> Filling tree
> ******************************************************************************
> *Tree :tree : test *
> *Entries : 10 : Total = 0 bytes File Size = 0 *
> * : : Tree compression factor = 1.00 *
> ******************************************************************************
> *Br 0 :keylen : keylen/I *
> *Entries : 10 : Total Size= 0 bytes File Size = 0 *
> *Baskets : 0 : Basket Size= 32000 bytes Compression= 1.00 *
> *............................................................................*
> *Br 1 :key : key[keylen]/C *
> *Entries : 10 : Total Size= 0 bytes File Size = 0 *
> *Baskets : 0 : Basket Size= 32000 bytes Compression= 1.00 *
> *............................................................................*
> *Br 2 :id : id[2]/I *
> *Entries : 10 : Total Size= 0 bytes File Size = 0 *
> *Baskets : 0 : Basket Size= 32000 bytes Compression= 1.00 *
> *............................................................................*
>
> Program received signal SIGSEGV, Segmentation fault.
> LoadOutput (file=@0x0) at main.C:73
> 73 tr->SetBranchAddress("keylen",&keylen);
> (gdb) where
> #0 LoadOutput (file=@0x0) at main.C:73
> #1 0x10b20 in main (argc=-4262088, argv=0xffbef8bc) at main.C:18
>
> //---------------------------------------------------------
> #include <TROOT.h>
> #include <TFile.h>
> #include <TTree.h>
> #include <Rtypes.h>
>
> void CreateOutput(TString &file, Bool_t mkFriends);
> void LoadOutput(TString &file);
>
> int main(Int_t argc, Char_t **argv)
> {
> TROOT showit("showit","showit");
>
> TString file1 = "sample1.root";
> CreateOutput(file1,0);
> TString file2 = "sample2.root";
> CreateOutput(file2,1);
>
> LoadOutput(file2);
>
> return 0;
> }
>
> //__________________________________________________________________________________
> void CreateOutput(
> TString &file,
> Bool_t mkFriends)
> {
> TFile *tfile = new TFile(file.Data(),"RECREATE","file");
> TTree *tree = new TTree("tree","test");
>
> Int_t keylen;
> Char_t *key = new Char_t[1024];
> Int_t id[2];
>
> TBranch *b1 = tree->Branch("keylen",&keylen,"keylen/I");
> TBranch *b2 = tree->Branch("key",key,"key[keylen]/C");
> TBranch *b3 = tree->Branch("id",id,"id[2]/I");
>
> Char_t *funny = "aap noot mies";
> printf("Filling tree\n");
> for (Int_t i = 0; i < 10; i++)
> {
> id[0] = i; id[1] = i+1;
> keylen = 10;
> strcpy(key,funny);
> keylen = strlen(key)+1;
> tree->Fill();
> }
>
> if (mkFriends)
> {
> tree->AddFriend("alias = tree","sample1.root");
> tree->Print();
> }
>
> delete [] key;
>
> tfile->Write();
> tfile->Close();
> }
>
> //__________________________________________________________________________________
> void LoadOutput(
> TString &file)
> {
> TFile tfile(file.Data());
> TTree *tr = (TTree*)gDirectory->Get("trades");
>
> Int_t keylen;
> Char_t *key = new Char_t[1024];
> Int_t id[2];
>
> tr->SetBranchAddress("keylen",&keylen);
> tr->SetBranchAddress("key",key);
> tr->SetBranchAddress("id",id);
>
> printf("Reading tree\n");
> Int_t nrBytes = 0;
> for (Int_t j = 0; j < tr->GetEntries(); j++)
> {
> nrBytes += tr->GetEvent(j);
> printf("%d %d %s\n",id[0],id[1],key);
> }
>
> delete tr;
> }
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:43 MET