Double reading (Scilab gateway) — How to read matrices of double in a gateway.
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, char* _pstName, int* _piRows, int* _piCols, double* _pdblReal)
SciErr readNamedComplexMatrixOfDouble(void* _pvCtx, char* _pstName, int* _piRows, int* _piCols, double* _pdblReal, double* _pdblImg)
Scilab environment pointer, pass in "pvApiCtx" provided by api_scilab.h
Address of the Scilab variable.
Name of the variable for "named" functions.
Return number of rows.
Return number of columns.
Return address of real data array (size: _iCols * _iRows).
Return address of imaginary data array (size: _iCols * _iRows).
This argument does not exist with getMatrixOfDouble and readNamedMatrixOfDouble.
Error structure where is stored errors messages history and first error number.
int read_double(char *fname,unsigned long fname_len)
{
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;
SciErr sciErr;
//check input and output arguments
CheckRhs(1,1);
CheckLhs(1,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, Rhs + 1, iRows, iCols, pdblImg, pdblReal);
}
else
{
for(i = 0 ; i < iRows * iCols ; i++)
{
pdblReal[i] = pdblReal[i] * -1;
}
sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 1, iRows, iCols, pdblReal);
}
if(sciErr.iErr)
{
printError(&sciErr, 0);
return 0;
}
LhsVar(1) = Rhs + 1;
return 0;
}
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