Re: Problem with ROOT and CINT

From: Rene Brun (Rene.Brun@cern.ch)
Date: Thu Apr 30 1998 - 17:37:37 MEST


Because this mail is of general interest, I post my answer to roottalk.
The latest versions of CINT, apparently, are confused in case
of a TF1 constructor with an interpreted function.
If TF1 is called only once with a reference to an interpreted function
(in the example below, the function func), the second call to TF1
invokes the wrong constructor.
I have already forwarded this problem to Masa.
There is a very simple solution to circumvent this problem.
You must force the fonction to a "void *". This helps CINT.
So, in your macro below, change the statements:

  TF1* myfunc1 = new TF1("myfunc1", func, -90., 90., 2);
  TF1* myfunc2 = new TF1("myfunc2", func, -90., 90., 2);
to
  TF1* myfunc1 = new TF1("myfunc1", (void*)func, -90., 90., 2);
  TF1* myfunc2 = new TF1("myfunc2", (void*)func, -90., 90., 2);

and your macro will work nicely.

Rene Brun





Mario Deile wrote:
> 
> Hello,
> 
> My name is Mario Deile, I work for ATLAS.
> I am doing my first steps with ROOT and have the following problem:
> 
> I am trying to plot 2 functions into 1 frame.
> Since the functions only differ in parameter values, I use the same
> function subroutine. Using the tutorial and the class reference guide on
> the web, I ended up with the following macro "test.C":
> 
> Double_t func(Double_t *x, Double_t *par) {
>   Double_t PI = 3.141592653589793;
>   Float_t xx = x[0] / 180. * PI;
>   return (par[0] * sqrt(3) * sin(xx) - (2 * par[1] + 1) * par[0] * cos(xx));
> }
> 
> //**********************************************************************
> 
> void main() {
>   gROOT->Reset();
>   TCanvas* c1 = new TCanvas("c1", "Radius Correlation", 200, 10, 700, 700);
>   c1->SetGridx();
>   c1->SetGridy();
> 
>   TF1* myfunc1 = new TF1("myfunc1", func, -90., 90., 2);
>   myfunc1->SetParameters(3., 1.);
>   myfunc1->Draw();
> 
>   c1->Update();
> 
>   TF1* myfunc2 = new TF1("myfunc2", func, -90., 90., 2);
>   myfunc2->SetParameters(3., 0.);
>   myfunc2->Draw("SAME");
> 
>   c1->Update();
> }
> 
> I start the macro with
>                        .L test.C
>                        main()
> 
> After correctly plotting the first function ROOT crashes with many
> subsequent
> "*** Break *** segmentation violation"
> 
> Swapping the order of the functions doesn't change anything. It is
> always the second which causes the crash.
> Plotting only 1 of the functions works well (for either of the 2).
> 
> Could I ask you to be so kind and look at the macro and tell me my
> mistake?



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