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

8 views (last 30 days)
kobuta
kobuta on 18 Oct 2016
Commented: kobuta on 20 Oct 2016
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
配列の最後の要素が取得されてしまう原因として考えられることがありましたらご回答いただきますようお願い致します。

Accepted Answer

Akihiro Yasuda
Akihiro Yasuda on 20 Oct 2016
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 Comment
kobuta
kobuta on 20 Oct 2016
ご回答ありがとうございます。
配列の最後の要素のポインタが取得されてしまった原因ですが、
S-Functionパラメータへのワークスペース変数の指定方法が間違っていました。
HELPの[Simulink→モデル化→ブロックライブラリ→User-Defined Functions→Simulink ブロック→S-Function]のページに記載されているS-Functionパラメータの指定方法で配列の場合はワークスペース変数名(X,Y)と記載するものと勘違いしており、2×2次元のワークスペース変数Aの場合はA(2,2)のように指定しておりました。
S-Functionパラメータへの指定をワークスペース変数名のAのみにしたところ、先頭の要素のポインタが取得できて全ての要素にもアクセスすることができました。

Sign in to comment.

More Answers (0)

Categories

Find more on General Applications in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!