필터 지우기
필터 지우기

C-MEX S-Function​パラメータにワークス​ペースの配列を渡す方​法について

조회 수: 3 (최근 30일)
kobuta
kobuta 2016년 10월 18일
댓글: kobuta 2016년 10월 20일
https://jp.mathworks.com/matlabcentral/answers/92454-c-mex-s-function#answer_101805
S-Functionパラメータに配列を渡す方法として上記のQAを参照させていただきましたが、
私の環境ではmxGetPr()で取得できるp[0]ポインタがp[3]の位置を表してしまいp[3]以外のデータにアクセスすることができません。
私が試した環境は以下の通りです。 MATLAB R2013b
・ワークスペースに作成した配列の要素の型:double
・配列の要素は整数のみ設定(3×4の配列に1~12などを設定)
・配列のサイズを変えてもmxGetPr()で取得できるのは必ず最後の要素のポインタ
また、調査のためssGetSFcnParamで取得したMATLAB配列を引数に以下の関数を実施した結果は以下の通りです
mxGetNumberOfDimensions → 2
mxGetDimensions → 1
mxGetNumberOfElements → 1
mxGetM → 1
mxGetN → 1
配列の最後の要素が取得されてしまう原因として考えられることがありましたらご回答いただきますようお願い致します。

채택된 답변

Akihiro Yasuda
Akihiro Yasuda 2016년 10월 20일
answer_101805にあるとおり、ssGetSFcnParamでmxArrayのポインタを取得し、mxGetPrの引数に渡せば、パラメーターへのポインタにアクセスできます。
添付ファイルは、デモモデルsfcndemo_timestwoを 2x2次元のパラメーターに変更しています。
(timestwo.cからmytimes.cへの主な変更点)
23行目:#define TIMES(S) ssGetSFcnParam(S, 0)
80行目:double *times = mxGetPr(TIMES(S));
88行目:*y++ = times[i] *(*uPtrs[i]);
なお、C-MEX S-Functionを独自に作成する場合、
まずはsfundemosから、参考になるデモモデルとソースコードを確認した後、
簡易なモデルを作成し、順次、所望の形へ近づける事をお勧めします。
[関連資料]
  댓글 수: 1
kobuta
kobuta 2016년 10월 20일
ご回答ありがとうございます。
配列の最後の要素のポインタが取得されてしまった原因ですが、
S-Functionパラメータへのワークスペース変数の指定方法が間違っていました。
HELPの[Simulink→モデル化→ブロックライブラリ→User-Defined Functions→Simulink ブロック→S-Function]のページに記載されているS-Functionパラメータの指定方法で配列の場合はワークスペース変数名(X,Y)と記載するものと勘違いしており、2×2次元のワークスペース変数Aの場合はA(2,2)のように指定しておりました。
S-Functionパラメータへの指定をワークスペース変数名のAのみにしたところ、先頭の要素のポインタが取得できて全ての要素にもアクセスすることができました。

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 General Applications에 대해 자세히 알아보기

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by