I would use a subroutine like this:
SV * fill_array(SV* name1, ...) {
int i;
Inline_Stack_Vars;
// find out how many values were passed
int n = Inline_Stack_Items;
// allocate memory for the data
New(0,array,n,double);
// iterate through the stack and assign it to the new array
for(i=0;i<Inline_Stack_Items;i++) {
array[i] = atof(SvPV(Inline_Stack_Item(i),PL_na));
}
// return the SV * to the newly allocated array
return sv_setref_pv(newSViv(0),"x", (void *)array);
}
Though if someone can tell me a way to eliminate the atof() call, I'd
appreciate it. I used to do it such that I used the regular C++ new, and
returned a double *, but Perl would not delete the memory cleanly that way.
This creates something PErl is more comfortable with.
Only thin is, when you pass the return value to another C subroutine, you
will need to put a line in like this:
void another_subroutine(SV * p) {
double * array = (double *) SvIV(SvRV(p));
}
Then you should be able to use array[n] as normal. I did this with char and
char * arrays (for images), but it should work for doubles just as well.
You may need to alter the Sv macros a bit, as I'm not too familiar with
them, but stuff like this works fine for me. Hope this helps.
--
Dave