It seems that cint has a problem with pointers to pointers to pointers, i.e.
double ***x;
In cint version 5.13.62 (which is what was in root version 1.03/09),
this apparently gets parsed as double** named *x, although the exact
behavior appears dependent on whether it is written as
double*** x;
or
double ***x;
After I discovered this I downloaded cint version 5.13.62 and compiled
it. The more recent version seems to parse ***x correctly (which
means mine is not an original discovery), but it still doesn't behave
correctly. The following macro file demonstrates the problem:
// - - - - - - - - - - - - - - -
// foo.C:
// - - - - - - - - - - - - - - -
{
double *x, **xp, ***xpp;
x = (double*)malloc(8*sizeof(double));
xp = (double**)malloc(4*sizeof(double*));
xpp = (double***)malloc(2*sizeof(double**));
for (int i = 0; i < 8; i++) x[i] = (double)i;
for (int i = 0; i < 4; i++) xp[i] = &(x[2*i]);
for (int i = 0; i < 2; i++) xpp[i] = &(xp[2*i]);
}
// - - - - - - - - - - - - - - -
If you type
.x foo.C
and then
xpp[0][0][0]
you get
0.0
which is correct. However
xpp[0][0][1]
returns
0.0
which is not correct (should be 1.0). Interestingly,
*(*(*(xpp+i)+j)+k)
works, i.e. it gives the correct value of xpp[i][j][k].
Since the code I'm working on uses a struct data type with double*** member
to hold a 3-D array, I'm completely stuck.
cheers
Ron Eastman
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ronald G. Eastman
Lawrence Livermore National Laboratory
L-041
7000 East Avenue, PO Box 808, Livermore California 94551
001-925-423-7340
reastman@llnl.gov