[Scilab-Dev] usage of push_back/front and pop_back/front in scilab API
Clément David
Clement.David at esi-group.com
Tue Apr 10 08:31:49 CEST 2018
Le lundi 09 avril 2018 à 16:07 +0200, Stéphane Mottelet a écrit :
> Le 09/04/2018 à 15:45, Stéphane Mottelet a écrit :
> > Hello,
> >
> > I have a newbie question about the usage of lists in the new scilab
> > API. When e.g. you have to construct a list of vectors constructed
> > from a vector
> >
> > double* YData
> >
> > which is updated and to be stored after each update in a list names
> > pDblYOutList. By writing
> >
> > pDblYOutList.push_back(pdYData);
> >
> > at each update, since the address of YData does not change, at the end
> > every term of the list will contain the same vector (ode bug :-(). I
> > have some ideas to fix that but how does one proceed *properly* in the
> > coding style of Scilab API ?
> >
> > S.
> >
> >
> >
>
> Supposing that pDblY0 exists, with the required size, and pDblYOut is a
> types::Double*, does the following do the trick:
>
> pDblYOut = new types::Double(pDblY0->getRows(), 1);
> pDblYOut->set(pdYData);
> pDblYOutList.push_back(pDblYOut->get());
>
> Thanks for hints, comments..
>
> S.
Hello Stéphane,
As `double* pdYData` is updated you have to copy the data to preserve the history ; you could either
use Scilab API to store types::Double or plain C++ to store double* :
auto pDblYOut = new types::Double(pDblY0->getRows(), 1);
pDblYOut->set(pdYData); // will copy pdYData
pDblYOutList->getData()->push_back(pDblYOut); // to preserve a pointer to the Scilab datatype with
// types::List* pDblYOutList
OR
auto temp = new double[pDblY0->getRows()];
memcpy(temp, pdYData, pDblY0->getRows()*sizeof(double));
pDblYOutList.push_back(temp); // using std::vector<double*> pDblYOutList
However (especially in ode() case) not that allocating on each loop step can be really slow ; having
all the buffers pre-allocated at first will slightly improve loop caching.
Regards,
--
Clément
More information about the dev
mailing list