メインコンテンツ

例: 実行時エラーを検出および報告するスタンドアロン C コードの生成

この例では、範囲外の配列インデックスなどの実行時エラーを検出して報告する C ライブラリまたは実行可能ファイルを生成する方法について示します。生成された C コードでエラーが検出されると、メッセージを報告し、プログラムを終了します。検出して修正できるのは、ターゲット ハードウェアで発生したエラーのみです。

ある構造体フィールドに別の構造体フィールドの値を使用してインデックス付けする関数 getelement を記述します。

function y = getelement(S) %#codegen
y = S.A(S.u);
end

スタンドアロン ライブラリまたは実行可能ファイルのコード構成オブジェクトを作成します。たとえば、スタティック ライブラリ用のコード構成オブジェクトを作成します。コード生成レポートを有効にします。

cfg = coder.config('lib');
cfg.GenerateReport = true;

実行時エラーの検出とレポートの生成を有効にします。

cfg.RuntimeChecks = true;

入力引数のプロパティを指定する際に使用できる入力例を定義します。

S.A = ones(2,2);
S.u = 1;

コードを生成します。

codegen -config cfg getelement -args {S}

[レポートの表示] リンクをクリックして、コード生成レポートを開きます。

生成ファイルのリストで、getelement.c をクリックします。

エラーをチェックし、エラーを報告する関数を呼び出すコードを確認できます。たとえば、コードで範囲外の配列インデックスのエラーが検出されると、rtDynamicBoundsError を呼び出してエラーを報告し、プログラムを終了します。

/* Include files */
#include "getelement.h"
#include "getelement_rtwutil.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

/* Variable Definitions */
static rtBoundsCheckInfo emlrtBCI = { 1,/* iFirst */
  4,                                   /* iLast */
  2,                                   /* lineNo */
  5,                                   /* colNo */
  "S.A",                               /* aName */
  "getelement",                        /* fName */
  "C:\\Users\\username\\Documents\\MATLAB\\runtime-error-ex\\getelement.m",/* pName */
  0                                    /* checkKind */
};

static rtDoubleCheckInfo emlrtDCI = { 2,/* lineNo */
  5,                                   /* colNo */
  "getelement",                        /* fName */
  "C:\\Users\\username\\Documents\\MATLAB\\runtime-error-ex\\getelement.m",/* pName */
  1                                    /* checkKind */
};

/* Function Definitions */
double getelement(const struct0_T *S)
{
  int i;
  if (S->u != (int)floor(S->u)) {
    rtIntegerError(S->u, &emlrtDCI);
  }

  i = (int)S->u;
  if ((i < 1) || (i > 4)) {
    rtDynamicBoundsError(i, 1, 4, &emlrtBCI);
  }

  return S->A[i - 1];
}

エラー報告ソフトウェアは fprintf を使用してエラー メッセージを stderr に書き込みます。abort を使用してアプリケーションを終了します。fprintf および abort が使用できない場合、指定しなければなりません。関数 abort はプログラムを突然終了します。信号がシステムでサポートされている場合、中止信号 (SIGABRT) を検出してプログラムの終了を制御できます。

参考

トピック