How to get the address of a list child.
SciErr getListItemAddress(void* _pvCtx, int* _piAddress, int _iItemNum, int** _piItemAddress)
: :_piAddress Address of the list. : :_iItemNum Item number. : :_piItemAddress Return address of the item. : :SciErr Error structure where is stored errors messages history and
first error number.
:
This help describes how to get the address of a list child.
#include "api_scilab.h"
int get_list_info(int* _piAddress);
void insert_indent(void);
static int iLocalTab = 0;
int common_list(char *fname,unsigned long fname_len)
{
SciErr sciErr;
int *piAddr = NULL;
CheckInputArgument(pvApiCtx, 1, 1);
sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
if(sciErr.iErr)
{
printError(&sciErr, 0);
return 0;
}
get_list_info(piAddr);
AssignOutputVariable(1) = 0;
return 0;
}
int get_list_info(int* _piAddress)
{
SciErr sciErr;
int i = 0;
int iRet = 0;
int iItem = 0;
//get list item number, failed if variable is not a kind of list
sciErr = getListItemNumber(pvApiCtx, _piAddress, &iItem);
if(sciErr.iErr)
{
printError(&sciErr, 0);
sciprint("This variable is not a list");
return 0;
}
sciprint("List (%d items) -> address : 0x%08X) : \n", iItem, _piAddress);
for(i = 0 ; i < iItem ; i++)
{
int iType = 0;
int* piAddrChild = NULL;
sciErr = getListItemAddress(pvApiCtx, _piAddress, i + 1, &piAddrChild);
if(sciErr.iErr)
{
printError(&sciErr, 0);
return 0;
}
sciErr = getVarType(pvApiCtx, piAddrChild, &iType);
if(sciErr.iErr)
{
printError(&sciErr, 0);
return 0;
}
if(iType == sci_list || iType == sci_tlist || iType == sci_mlist)
{
insert_indent();
sciprint("Child %d -> ", i + 1);
iLocalTab++;
iRet = get_list_info(piAddrChild);
iLocalTab--;
if(iRet)
{
return 1;
}
}
else
{
insert_indent();
sciprint("Child %d -> address : 0x%08X\n", i + 1, piAddrChild);
}
}
return 0;
}
void insert_indent(void)
{
int i = 0;
for(i = 0 ; i < iLocalTab ; i++)
{
sciprint("\t");
}
}
l1 = [1,2*%i,3;%i,2,3*%i];
l2 = ["may","the";"puffin","be";"with","you"];
l3 = `int8`_([1,2,3]);
l5 = `list`_(l1,l2,l3);
l4 = `list`_(l5, `list`_(l5,l5));
l6 = `uint16`_([1000,2000,3000]);
l = `list`_(l1,l2,l3,l6,l4,l5);
common_list(l)