[Scilab-Dev] Accessing the stack
Antoine ELIAS
antoine.elias at scilab.org
Fri Jan 9 11:08:53 CET 2009
Hi Yann,
I think you are fluent in stack language :D
So I wrote some functions to "abstract" the complexity of the stack
structures but these functions aren't available in the git master branch
(only in YaSp branch).
I don't have enough time for the moment to make all tests to validate
them but I hope you can find information for your stack problem ...
modules/core/includes/stack3.h:
http://gitweb.scilab.org/?p=scilab;a=blob;f=scilab/modules/core/includes/stack3.h;h=315fbeb8cd85bd0f83e84b90637e8e359ac4eaaf;hb=refs/heads/YaSp
( line 134 to the EOF ) and
modules/core/src/c/stack3.c :
http://gitweb.scilab.org/?p=scilab;a=blob;f=scilab/modules/core/src/c/stack3.c;h=ee1dcab2a5ec276e21fd34d5a8169a54df608d71;hb=refs/heads/YaSp
( line 1272 to EOF )
In your case:
*istk(iadr(1)) = 1; // For a vector of double
I think iadr(1) must be replaced by iadr(*Lstk(VariablePosition))
with Lstk macro, you get the "Scilab address" of the variable in the
stack via vstk.lstk array and after translate this "Scilab address" to a
real pointer ( int* ) with iadr ( easy ! )
Sample :
int iAddr = iadr(*Lstk(Top - Rhs + YourNewVarPosition));
int* piAddr = istk(iAddr);
piAddr[0] = 1; //sci_matrix
piAddr[1] = 2; //Rows
piAddr[2] = 3; //Cols
piAddr[3] = 0; //Real
double *pdblRealData = (double*)(_piAddr + 4);
for(i = 0 ; i < 6 ; i++)
{
pdblRealData[i] = 1.0;
}
I hope you can resolve your problem, don't hesitate to ask me, here or
directly, if you have any questions about the stack.
ELIAS Antoine
antoine.elias at scilab.org
ycollet at freesurf.fr a écrit :
> Hello,
>
> I have some questions related to how to access the stack.
> I would like to create a function which takes a mlist as parameters and
> returns a pointers to one element of the list. Something like:
>
> GetRhsVar(1, "m", &m_list, &n_list, &l_list);
> GetListVar(1, &m_list, &n_list, &l_list, 2, "d", &m_param_2, &n_param_2,
> &l_param_2);
>
> And now, I am able to access to the element 2 of the mlist like a normal
> scilab variable.
> I needed such a function to be able to access / create mlist in mlist.
>
> So my questions are related to the functions used to access the stack.
>
> iadr(pos): returns a "scilab pointer" to an int variable stored at position
> pos on the stack ?
> sard(pos): returns a "scilab pointer" to a double variable stored at
> position pos on the stack ?
> card(pos): returns a "scilab pointer" to a char variable stored at position
> pos on the stack ?
>
> Lstk(pos): returns a generic "scilab pointer" to a variable stored at
> position pos on the stack ?
>
> What are the use of the vstk, com and iop stack structure ?
>
> The document "scilab internal" is a little bit hard to understand / read
> for such questions.
>
> Now, let's try to create manually a vector of doubles:
>
> From the wiki:
>
> Type 32 bits 1 integer from Scilab Internal Datatypes
> Lines 32 bits 1 integer, number of lines in the matrix, for a
> single number, Scilab store it like a matrix [1,1]
> Columns 32 bits 1 integer, number of columns in the matrix, for
> a single number, Scilab store it like a matrix [1,1]
> Complex 32 bits 1 integer, 0 for real number, 1 for complex
> number
> Real part n * 64 bits Each real part is store in a double
> Imaginary part n * 64 bits Each imaginary part is store in a double
>
> // My var is at position 1
>
> *istk(iadr(1)) = 1; // For a vector of double
> *istk(iadr(1)+1) = 2;
> *istk(iadr(1)+2) = 3; // So we have a 2x3 matrix
> *istk(iadr(1)+3) = 0: // and it's a real matrix
> for(i=0;i<6;i++) *istk(iadr(1)+4+2*i+0) = 1.0;
>
> Am I accessing the double vector structure correctly ?
>
> YC
>
>
More information about the dev
mailing list