2

ブール値の配列を出力する S 関数を書いています (4 つの位置)

mdlOutputs コールバック内に出力を書き込んでいるときに、アクセス メモリ違反が発生しています。

このエラーは瞬間的なものではありません。つまり、後でクラッシュし、Matlab が致命的なエラーを出すまで、コードは正常に実行されます。デバッグしたので、memcpy 操作にエラーがあると確信しており、このコード行をコメントした後は正常に動作します。また、データ型がスカラーの場合、100% 正常に実行されます。

それで、私はいくつかの質問があります:

  1. memcpy を使用して配列の値を simulink に書き込むにはどうすればよいですか?
  2. simulink の出力メモリは連続メモリ ブロックであると仮定しました。それが正しいか?
  3. それを解決する方法についてのヒントはありますか?

擬似コードは次のとおりです。

static void mdlOutputs ( SimStruct* S, int_T tid ) {
(...)
//src variable defined here
(...)

void* dst;

// get output port data type id
type = ssGetOutputPortDataType ( S, i );  // type = SS_BOOLEAN

// get data type size
size = ssGetDataTypeSize ( S, type );   //size = 1 byte

// get output port signal pointer
dst = ( void* ) ssGetOutputPortSignal ( S, i );  //dst has a valid value

// get output port width
width = ssGetOutputPortWidth ( S, i );  //width is 4, since it is a 4 position array

size = size * width; // size now is 4

memcpy ( dst, src, size );     // Error
}
4

0 に答える 0