[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