ブール値の配列を出力する S 関数を書いています (4 つの位置)
mdlOutputs コールバック内に出力を書き込んでいるときに、アクセス メモリ違反が発生しています。
このエラーは瞬間的なものではありません。つまり、後でクラッシュし、Matlab が致命的なエラーを出すまで、コードは正常に実行されます。デバッグしたので、memcpy 操作にエラーがあると確信しており、このコード行をコメントした後は正常に動作します。また、データ型がスカラーの場合、100% 正常に実行されます。
それで、私はいくつかの質問があります:
- memcpy を使用して配列の値を simulink に書き込むにはどうすればよいですか?
- simulink の出力メモリは連続メモリ ブロックであると仮定しました。それが正しいか?
- それを解決する方法についてのヒントはありますか?
擬似コードは次のとおりです。
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
}