Name

Pointer reading (Scilab gateway) — How to read pointer in a gateway.

Calling Sequence

Input argument profile:

SciErr createNamedPointer(void* _pvCtx, char* _pstName, void* _pvPtr)

Named variable profile:

SciErr readNamedPointer(void* _pvCtx, char* _pstName, void** _pvPtr)

Parameters

_pvCtx

Scilab environment pointer, pass in "pvApiCtx" provided by api_scilab.h

_piAddress

Address of the Scilab variable.

_pvPtr

Return address of pointer.

SciErr

Error structure where is stored errors messages history and first error number.

Description

This help describes how pointer can be handled through the Scilab API.

Gateway Source

	 
int read_pointer(char *fname,unsigned long fname_len)
{
	SciErr sciErr;
	CheckRhs(0,1);
	CheckLhs(1,1);

	if(Rhs == 0)
	{//create mode
		double* pdblData	= (double*)malloc(sizeof(double) * 2 * 2);
		pdblData[0]			= 1;
		pdblData[1]			= 3;
		pdblData[2]			= 2;
		pdblData[3]			= 4;

		sciErr = createPointer(pvApiCtx, Rhs + 1, (void*)pdblData);
	}
	else if(Rhs == 1)
	{//read mode
		int iType			= 0;
		int* piAddr			= NULL;
		void* pvPtr			= NULL;
		double* pdblData	= NULL;

		sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
		if(sciErr.iErr)
		{
			printError(&sciErr, 0);
			return 0;
		}

		sciErr = getPointer(pvApiCtx, piAddr, &pvPtr);
		if(sciErr.iErr)
		{
			printError(&sciErr, 0);
			return 0;
		}

		pdblData = (double*)pvPtr;

		sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 1, 2, 2, pdblData);
	}
	else
	{
		return 0;
	}

	if(sciErr.iErr)
	{
		printError(&sciErr, 0);
		return 0;
	}

	LhsVar(1) = Rhs + 1;
	return 0;
}
 

Scilab test script

 
b_ref = [1,2;3,4];
a = read_pointer();
b = read_pointer(a);
if or(b <> b_ref) then error("failed"), end