変数リファレンス (Scilabゲートウェイ)
引数のアドレスまたはゲートウェイの変数を取得する方法.
呼び出し手順
入力引数プロファイル:
SciErr getVarAddressFromPosition(void* _pvCtx, int _iVar, int** _piAddress)
名前指定変数プロファイル:
SciErr getVarAddressFromName(void* _pvCtx, const char* _pstName, int** _piAddress)
引数
- _pvCtx
Scilab環境ポインタ, api_scilab.hで定義される "pvApiCtx" を指定
- _iVar
関数コール時の引数の位置.
- _pstName
Scilab変数名.
- _piAddress
Scilab変数のリターンアドレス.
- SciErr
エラー構造体で,エラーメッセージ履歴と最初のエラー番号を保持します.
説明
この関数はゲートウェイの引数のアドレスを取得します.
ゲートウェイのソース
#include "api_scilab.h" SciErr printf_info(int _iVar); int common_function(char *fname,void* pvApiCtx) { SciErr sciErr; int i; int *piAddr1 = NULL; int iBool = 0; for(i = 0 ; i < nbInputArgument(pvApiCtx) ; i++) { sciErr = printf_info(i + 1); if(sciErr.iErr) { printError(&sciErr, 0); break; } sciprint("\n\n"); } // trueの場合に1,それ以外は 0 iBool = sciErr.iErr == 0 ? 1 : 0; sciErr = createMatrixOfBoolean(pvApiCtx, nbInputArgument(pvApiCtx) + 1, 1, 1, &iBool); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } // 確保された変数を左辺に代入 AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1; return 0; } SciErr printf_info(int _iVar) { SciErr sciErr; int* piAddr = NULL; int iType = 0; int iRows = 0; int iCols = 0; int iItem = 0; int iComplex = 0; sciErr = getVarAddressFromPosition(pvApiCtx, _iVar, &piAddr); if(sciErr.iErr) { return sciErr; } sciprint("Variable %d information:\n", _iVar); sciErr = getVarType(pvApiCtx, piAddr, &iType); if(sciErr.iErr) { return sciErr; } sciprint("\tType: "); switch(iType) { case sci_matrix : sciprint("double\n"); break; case sci_poly : sciprint("polynomial\n"); break; case sci_boolean : sciprint("boolean\n"); break; case sci_sparse : sciprint("sparse\n"); break; case sci_boolean_sparse : sciprint("boolean_sparse\n"); break; case sci_ints : { char pstSigned[] = "signed"; char pstUnsigned[] = "unsigned"; char* pstSign = pstSigned; int iPrec = 0; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddr, &iPrec); if(sciErr.iErr) { return sciErr; } if(iPrec > 10) { pstSign = pstUnsigned; } sciprint("%s integer %d bits\n", pstSign, (iPrec % 10) * 8); } break; case sci_strings : sciprint("strings\n"); break; case sci_list : sciprint("list\n"); break; case sci_tlist : sciprint("tlist\n"); break; case sci_mlist : sciprint("mlist\n"); break; default : sciprint("Not manage by this function\n"); return sciErr; } if(isVarComplex(pvApiCtx, piAddr)) { sciprint("\tComplex: Yes\n"); } sciprint("\tDimensions: "); if(isVarMatrixType(pvApiCtx, piAddr)) { sciErr = getVarDimension(pvApiCtx, piAddr, &iRows, &iCols); if(sciErr.iErr) { return sciErr; } sciprint("%d x %d", iRows, iCols); } else { sciErr = getListItemNumber(pvApiCtx, piAddr, &iItem); if(sciErr.iErr) { return sciErr; } sciprint("%d", iItem); } return sciErr; }
Scilabテストスクリプト
Report an issue | ||
<< CheckOutputArgument | Low level functions | 変数の次元 (Scilabゲートウェイ) >> |