Re: How can I execute a macro that calls a function?

Rene Brun (Rene.Brun@cern.ch)
Fri, 06 Mar 1998 08:51:49 +0100


In your macro below, replace the VERY CONFUSING notation **
by the standard array notation and your program will work.
change:

for (Int_t i=0; i<n; i++) {
tt1 = tt1 + 1 * *(w+i) * *(w+i);
tt2 = tt2 + *(x+i) * *(x+i) * *(w+i) * *(w+i);
tt3 = tt3 + *(x+i) * *(w+i) * *(w+i);
tt4 = tt4 + *(y+i) * *(w+i) * *(w+i);
tt5 = tt5 + *(y+i) * *(x+i) * *(w+i) * *(w+i);
}
to:
for (Int_t i=0; i<n; i++) {
tt1 = tt1 + 1 * w[i] * w[i];
tt2 = tt2 + x[i] * x[i] * w[i] * w[i];
tt3 = tt3 + x[i] * w[i] * w[i];
tt4 = tt4 + y[i] * w[i] * w[i];
tt5 = tt5 + y[i] * x[i] * w[i] * w[i];
}

Rene Brun

> Hi,
> I tried to execute a macro("ytrack.C") that calls a function("sfit") but
> it gives the following error message.
>
> To execute a macro("ytrack.C"), I typed
> root [0] .x ytrack.C
>
> Is there something wrong with handling pointers in my function "sfit"?
> In the sense of C it should be no problem.
>
> Or is there something wrong with handling function inside ROOT
> interpreter? My function "sfit" does not return any value. It assigns a
> value on variable that is in "ytrack.C" using pointer.
> ^^^^^^^^^^^^^^
> Stand alone version of "ytrack.C" had no problem.
>
> ======================== Error message ==============================
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:10
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:10
> * Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:11
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:11
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:11
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:11
> Error: Illegal pointer operation (tovalue) FILE:ytrack.C LINE:11
> * Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:12
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:12
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:12
> Error: Illegal pointer operation (tovalue) FILE:ytrack.C LINE:12
> * Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:13
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:13
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:13
> Error: Illegal pointer operation (tovalue) FILE:ytrack.C LINE:13
> * Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:14
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:14
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:14
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:14
> Error: Illegal pointer operation (tovalue) FILE:ytrack.C LINE:14
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:9
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:9
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:9
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:9
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:9
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:9
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:9
> @ Error: Illegal pointer operation (bstore:3) FILE:ytrack.C LINE:9
>
> ================================ "ytrack.C" is ================
> // function declaration
> void sfit(Int_t n,Float_t *x,Float_t *y,Float_t *w,Float_t *pb0,Float_t
> *pb1);
>
> // function definition
> void sfit(Int_t n,Float_t *x,Float_t *y,Float_t *w,Float_t *pb0,Float_t
> *pb1)
> {
>
> Float_t tt1,tt2,tt3,tt4,tt5,ss;
>
> tt1 = tt2 = tt3 = tt4 = tt5 = 0.;
>
> for (Int_t i=0; i<n; i++) {
> tt1 = tt1 + 1 * *(w+i) * *(w+i);
> tt2 = tt2 + *(x+i) * *(x+i) * *(w+i) * *(w+i);
> tt3 = tt3 + *(x+i) * *(w+i) * *(w+i);
> tt4 = tt4 + *(y+i) * *(w+i) * *(w+i);
> tt5 = tt5 + *(y+i) * *(x+i) * *(w+i) * *(w+i);
> }
>
> ss = tt1*tt2 - tt3*tt3;
>
> if (ss == 0) {
> *pb0 = -999;
> *pb1 = -999;
> }
> else {
> *pb0 = (tt2*tt4 - tt5*tt3)/ss;
> *pb1 = (tt1*tt5 - tt3*tt4)/ss;
> }
> }
>
> // main function
> void ytrack()
> {
> Int_t noy;
>
> Float_t szzy[5];
> Float_t sypos[5];
> Float_t syesum[5];
> Float_t silyin;
> Float_t b0,b1;
>
> ... processing data & assign values on noy,szzy,sypos,syesum
>
> //call function "sfit"
> sfit(noy,szzy,sypos,syesum,&b0,&b1);
>
> silyin = b0 + b1*46.764;
> printf("%g\n",silyin);
>
> }
> ==========================================================================
>
> ---
> Thanks a lot!
> Jayoung Wu
>
>