Re: passing array of floats (or vectors) into another function -
data scope - hmmm. Very ugly...
On 10/17/2011 3:20 PM, someone wrote:
On Oct 17, 7:43 pm, Victor Bazarov<v.baza...@comcast.invalid> wrote:
On 10/17/2011 1:14 PM, someone wrote:
Thanks a lot for any hints / suggestions!
Don't mention it.
Hi,
Ok, now I.... sort of.... solved my problem in a very "C'ish" way.
Maybe there is a better/nicer C++ way?
Let me show what I did to make it work, and maybe it's more clear for
those who care (and if not, I think this solution is acceptable for
me)...
//===============================================
double *xvec; // global
double *yvec; // global
unsigned long long Nlength = 0; // global
int mysample(mglGraph *gr, void *)
{
mglData xvals, yvals;
xvals.Set(xvec,Nlength); // get from global array
yvals.Set(yvec,Nlength); // get from global array
gr->Plot(xvals,yvals); // plot
return 0;
}
int main(int argc,char **argv)
{
xresReader myBinReader; // my "reader-class" (actually a struct)
myBinReader.readNow(); // read from binary file, put data in memory
Nlength = myBinReader.timesteps_loaded;
//====================== PLOT ======================
mglGraphFLTK gr;
xvec = new double[Nlength];
yvec = new double[Nlength];
#define sensNum 1
for(unsigned int i=0;i<Nlength;i++)
{
// actually: myBinReader.RTtime is a vector<floats>
xvec[i] = myBinReader.RTtime[i]; // store consecutively
// actually: myBinReader.RTSensor is a vector<
vector<floats> >
yvec[i] = myBinReader.RTSensor[i][sensNum];
}
gr.Window(argc,argv,mysample,"MathGL examples");
Apparently you're supplying the name (and behind that name there is a
pointer) to your function-callback. For whatever reason the 'Window'
needs 'argc', 'argv' (probalby so that you can give command-line
arguments to your executable and they get transmitted over to the
'mglGraphFLTK' toolkit). Do you see "MathGL examples" written anywhere
when your window ('gr') is shown? If so, the fourth argument to the
'Window' member function of the toolkit object is the title (probably).
Where would you pass your argument? You need to read about the
callback function. It should explain the role of the second argument,
where it comes from and how to set it in your program.
You can give it a name in your 'mysample' implementation:
int mysample(mglGraph* gr, void* some_data)
but the documentation should explain what to do with it.
delete[] xvec;
delete[] yvec;
return mglFlRun();
}
//===============================================
Ok, so this is not as stupid as I thought it would be to begin with...
What I do is to allocate memory and have a global pointer that can
then access the allocated array in a function where I (at least) think
that I have no other way of accessing the data (???)...
Maybe it's a simple question for you... When I wrote the first post, I
confused myself a bit. I still think this is not very C++'ish, but
it's the best I can do now, but I would like to learn from someone
here if you have better suggestions :-)
Thanks for any comments, if you like... If not, then this is the way
it's gonna be - it works :-)
Global data have bad rap - they aren't very nice, not thread-safe, etc.
They can change when you're working with them, no good scope or
lifetime control, and that's why [justifiedly] many don't like global
data. It's much better to pass parameters. Prefer parameter passing
over global data any day of the week.
V
--
I do not respond to top-posted replies, please don't ask