ゲートウェイで文字列の行列を読み込む方法.
入力引数プロファイル:
SciErr getMatrixOfString(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, int* _piLength, char** _pstStrings)
SciErr getMatrixOfWideString(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, int* _piLength, wchar_t** _pwstStrings)
名前指定変数プロファイル:
SciErr createNamedMatrixOfString(void* _pvCtx, const char* _pstName, int _iRows, int _iCols, char** _pstStrings)
SciErr createNamedMatrixOfWideString(void* _pvCtx, const char* _pstName, int _iRows, int _iCols, wchar_t** _pwstStrings)
Scilab環境ポインタ, api_scilab.h により定義された "pvApiCtx"で指定.
Scilab変数のアドレス.
"名前指定"関数の場合の変数名.
返される行数.
返される列数.
文字列長の配列のアドレス (要メモリ確保, 大きさ: _piRows * _piCols)
char*の配列のアドレス (要メモリ確保, 大きさ: _piRows * _piCols)
wchar_t* の配列のアドレス(要メモリ確保, 大きさ: _piRows * _piCols)
エラー構造体で,エラーメッセージ履歴と最初のエラー番号を格納します.
このヘルプはScilab APIにより文字列の行列を処理する方法を示します.
#include "api_scilab.h" int read_string(char *fname,void* pvApiCtx) { SciErr sciErr; int i,j; int iLen = 0; //変数の情報 int iRows = 0; int iCols = 0; int* piAddr = NULL; int* piLen = NULL; char** pstData = NULL; //output variable int iRowsOut = 1; int iColsOut = 1; char* pstOut = NULL; //入力/出力引数の確認 CheckInputArgument(pvApiCtx, 1, 1); CheckOutputArgument(pvApiCtx, 0, 1); //変数アドレスを取得 sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } //次元を取得するための最初のコール sciErr = getMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, NULL, NULL); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } piLen = (int*)malloc(sizeof(int) * iRows * iCols); //各文字列の長さを取得するための2回目のコール sciErr = getMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, piLen, NULL); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } pstData = (char**)malloc(sizeof(char*) * iRows * iCols); for(i = 0 ; i < iRows * iCols ; i++) { pstData[i] = (char*)malloc(sizeof(char) * (piLen[i] + 1));//+ 1 for null termination } //データ取得用の3回目のコール sciErr = getMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, piLen, pstData); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } //全文字列の長さを計算 for(i = 0 ; i < iRows * iCols ; i++) { iLen += piLen[i]; } //出力変数用のメモリを確保 pstOut = (char*)malloc(sizeof(char) * (iLen + iRows * iCols)); //文字列を0x00に初期化 memset(pstOut, 0x00, sizeof(char) * (iLen + iRows * iCols)); //入力文字列を出力文字列に結合 for(i = 0 ; i < iRows ; i++) { for(j = 0 ; j < iCols ; j++) { int iCurLen = strlen(pstOut); if(iCurLen) { strcat(pstOut, " "); } strcpy(pstOut + strlen(pstOut), pstData[j * iRows + i]); } } //新規変数を作成 sciErr = createMatrixOfString(pvApiCtx, nbInputArgument(pvApiCtx) + 1, iRowsOut, iColsOut, &pstOut); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } //メモリを解放 free(piLen); for(i = 0 ; i < iRows * iCols ; i++) { free(pstData[i]); } free(pstData); free(pstOut); AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1; return 0; }
a_ref = ["may the puffin be with you"]; a = ["may", "the", "puffin"; "be","with","you"]; b = read_string(a); if a_ref <> b then error("failed"), end | ![]() | ![]() |