Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

範囲外配列アクセスの検出のモデル例

この例では、配列の範囲外へのアクセス エラーを検出し、解析結果を確認する方法を示します。モデル例 sldvdemo_array_bounds で、ComputeIndex MATLAB Function ブロックは入力信号の値を使用してインデックスの範囲を最小 minIdx および最大 maxIdx で決定します。ArrayOp_Matlab、ArrayOp_MAL および ArrayOp_SF ブロックは minIdx から maxIdx までの整数インデックスのセットを使用し、配列の要素にアクセスして配列操作を実行します。

手順 1: モデルを開く

コマンド プロンプトで、次を入力します。

open_system('sldvdemo_array_bounds');

手順 2: 設計エラー検出解析の実行

配列の範囲外へのアクセス エラーを検出できるように解析オプションがあらかじめ構成されています。これらのオプションを表示するには、Simulink エディターで [表示オプション] ボタンをダブルクリックします。

設計エラー検出解析を実行するには、Simulink エディターで [実行] ボタンをダブルクリックします。解析の進行を表示する [Simulink Design Verifier の検証結果の概要] ウィンドウが開きます。解析が完了すると、モデル例は解析結果に基づいて強調表示されます。

手順 3: 解析結果のレビュー

チャート内の解析結果を表示するには、赤で強調表示されている ArrayOp_SF Chart ブロックをダブルクリックします。

Simulink Design Verifier は、状態 Diff の配列 u でインデックスの範囲外エラーが発生することを検出します。

手順 4: ハーネスの作成とテスト ケースのシミュレーション

最初の [テスト ケースを表示] リンクをクリックします。Simulink Design Verifie は、配列の範囲外へのアクセス エラーを示すテスト ケースを含むハーネス モデルを作成して開きます。Signal Builder のダイアログ ボックスで [シミュレーションの開始] をクリックして、Test Case 2 を含むハーネス モデルのシミュレーションを実行します。

Diff 状態になる前にシミュレーションは停止し、Stateflow® Debugger が開きます。次のエラーが表示されます。

Attempted to access index 4 of u with smaller dimension sizes. The valid index range is 0 to 3. This error will stop the simulation. State 'Diff' in Chart 'sldvdemo_array_bounds_harness/Test Unit (copied from sldvdemo_array_bounds)/ArrayOp_SF': y = u[maxIdx] - u[minIdx];

このブレークポイントで Stateflow® Debugger を開いたままにしておきます。sldvdemo_array_bounds_harness モデル内の Diff 状態の上にカーソルを合わせ、このシミュレーションのブレークポイントでのデータ値を確認します。

ComputeIndex MATLAB Function ブロックは、Test Case 2 入力信号値を使用して、配列のインデックスの範囲が 1:4 であることを判別します。1 ベースのインデックスは MATLAB 構文と一致するため、これらのインデックスは ArrayOp_Matlab MATLAB Function ブロックおよび ArrayOp_MAL Stateflow® チャートで有効です。

ArrayOp_SF Stateflow® チャートはアクション言語として C を使用します。この言語は 1 ベースのインデックスをサポートしていません。したがって、1:4 はチャートの配列アクセスの有効なインデックス範囲ではありません。配列アクセスの有効なインデックス範囲は、エラー メッセージで報告されたように、0:3 です。maxIdx または minIdx が 4 と評価される場合、配列の範囲外へのアクセス エラーが ArrayOp_SF Chart ブロックで発生します。0 ベースのインデックスのサポートの詳細については、アクション言語構文としての MATLAB と C の相違点 (Stateflow)を参照してください。