Double reading (Scilab gateway)
How to read matrices of double in a gateway.
Syntax
Input argument profile:
SciErr getMatrixOfDouble(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, double** _pdblReal)
SciErr getComplexMatrixOfDouble(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, double** _pdblReal, double** _pdblImg)
Named variable profile:
SciErr readNamedMatrixOfDouble(void* _pvCtx, const char* _pstName, int* _piRows, int* _piCols, double* _pdblReal)
SciErr readNamedComplexMatrixOfDouble(void* _pvCtx, const char* _pstName, int* _piRows, int* _piCols, double* _pdblReal, double* _pdblImg)
Arguments
- _pvCtx
Scilab environment pointer, pass in "pvApiCtx" provided by api_scilab.h
- _piAddress
Address of the Scilab variable.
- _pstName
Name of the variable for "named" functions.
- _piRows
Return number of rows.
- _piCols
Return number of columns.
- _pdblReal
Return address of real data array (size: _iCols * _iRows). For "Named" function, _pdblReal must be allocated before calling function.
- _pdblImg
- Return address of imaginary data array (size: _iCols * _iRows). For "Named" function, _pdblImg must be allocated before calling function.
- SciErr
Error structure where is stored errors messages history and first error number.
Description
This help describes how matrix of doubles can be handled through the Scilab API.
Gateway Source
#include "api_scilab.h" int read_double(char *fname,void* pvApiCtx) { SciErr sciErr; int i; //first variable info : real matrix of double int iType = 0; int iRows = 0; int iCols = 0; int iComplex = 0; int *piAddr = NULL; double* pdblReal = NULL; double* pdblImg = NULL; //check input and output arguments CheckInputArgument(pvApiCtx, 1, 1); CheckOutputArgument(pvApiCtx, 0, 1); /************************ * First variable * ************************/ //get variable address of the first input argument sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } //check type sciErr = getVarType(pvApiCtx, piAddr, &iType); if(sciErr.iErr || iType != sci_matrix) { printError(&sciErr, 0); return 0; } //get complexity iComplex = isVarComplex(pvApiCtx, piAddr); //check complexity if(iComplex) { //get size and data from Scilab memory sciErr = getComplexMatrixOfDouble(pvApiCtx, piAddr, &iRows, &iCols, &pdblReal, &pdblImg); } else { //get size and data from Scilab memory sciErr = getMatrixOfDouble(pvApiCtx, piAddr, &iRows, &iCols, &pdblReal); } if(sciErr.iErr) { printError(&sciErr, 0); return 0; } //Do something with data //if variable is complex, switch real part and imaginary part otherwise multiply by -1 if(iComplex) { sciErr = createComplexMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 1, iRows, iCols, pdblImg, pdblReal); } else { for(i = 0 ; i < iRows * iCols ; i++) { pdblReal[i] = pdblReal[i] * -1; } sciErr = createMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 1, iRows, iCols, pdblReal); } if(sciErr.iErr) { printError(&sciErr, 0); return 0; } AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1; return 0; }
Scilab test script
a = [ 0 1 2 3; .. 4 5 6 7; .. 8 9 10 11]; b = [ 23*%i, 1+22*%i, 2+21*%i, 3+20*%i, 4+19*%i, 5+18*%i; .. 6+17*%i, 7+16*%i, 8+15*%i, 9+14*%i, 10+13*%i, 11+12*%i; .. 12+11*%i, 13+10*%i, 14+9*%i, 15+8*%i, 16+7*%i, 17+6*%i; .. 18+5*%i, 19+4*%i, 20+3*%i, 21+2*%i, 22+1*%i, 23]; a2 = read_double(a); b2 = read_double(b); if or(a2 <> a * -1) then error("failed"), end if or(b2 <> (imag(b) + real(b) * %i)) then error("failed"), end
Report an issue | ||
<< deleteNamedVariable | Low level functions | Double writing (Scilab gateway) >> |