Main Content

MATLAB ソース コードへの生成された C/C++ コードのトレース

生成された C/C++ コードの元の MATLAB® ソース コードへのトレースには、次のような利点があります。

  • 生成コードがアルゴリズムをどのように実装しているかを理解することができます。

  • 生成されたコードの品質を評価できます。

次のいずれかの方法を使用してトレースできます。

  • MATLAB ソースコードをコメントとして含むコードを生成するように、MATLAB Coder™ を設定します。コメントでは、トレーサビリティ タグがソース コードの各行の直前に挿入されます。トレーサビリティ タグには、ソース コードの場所の詳細が表示されます。Embedded Coder® を利用している場合、コード生成レポートでは、トレーサビリティ タグが対応する MATLAB ソース コードにリンクしています。

  • Embedded Coder を使用して、双方向トレーサビリティを含むコード生成レポートを生成します。レポートの双方向トレースにより、MATLAB ソース コードおよび生成された C/C++ コードの間のマッピングを可視化しやすくなります。Interactively Trace Between MATLAB Code and Generated C/C++ Code (Embedded Coder)を参照してください。

トレーサビリティ タグの生成

生成されたコードでトレーサビリティ タグを生成するには、コメントとしての MATLAB ソース コードの生成を有効化します。

  • MATLAB Coder アプリで、[コメントとして MATLAB ソース コードを含める][はい] に設定します。

  • コード生成構成オブジェクトで、MATLABSourceCommentstrue に設定します。

トレーサビリティ タグの形式

生成コードで、トレーサビリティ タグはコメント内の MATLAB ソース コードの直前に挿入されます。タグの形式は次のとおりです。
<filename>:<line number>

たとえば、このコメントは、コード x = r * cos(theta); がソース ファイル straightline.m4 行目に表示されることを示します。

/* 'straightline:4' x = r * cos(theta); */

生成コード内でのコメントの位置

ソース コードおよびトレーサビリティ タグを含む生成コメントは、生成されたコード内に次のように挿入されます。

直線ソース コード

ifwhilefor および switch ステートメントが存在しない直線ソース コードでは、ソース コードを含むコメントが、ソース コード ステートメントを実装する生成コードの前に挿入されます。このコメントは、生成コードの前にあるユーザー コメントの後に挿入されます。

たとえば次のコードでは、ユーザー コメント /* Convert polar to Cartesian */ は、トレーサビリティ タグが付いたソース コードの最初の行を含む次の生成コメントの前に挿入されます。
/* 'straightline:4' x = r * cos(theta); */

MATLAB コード

function [x, y] = straightline(r,theta)
%#codegen
% Convert polar to Cartesian
x = r * cos(theta);
y = r * sin(theta);

コメント付きの C コード

void straightline(double r, double theta, double *x, double *y)
{
  /*  Convert polar to Cartesian */
  /* 'straightline:4' x = r * cos(theta); */
  *x = r * cos(theta);

  /* 'straightline:5' y = r * sin(theta); */
  *y = r * sin(theta);
}

if ステートメント

if ステートメントに対するコメントは、そのステートメントを実装するコードの直前に挿入されます。このコメントは、生成コードの前にあるユーザー コメントの後に挿入されます。elseif および else 節に対するコメントは、その節を実装するコードの直後の、その節の中のステートメントとして生成されたコードの前に挿入されます。

MATLAB コード

function y = ifstmt(u,v) 
%#codegen
if u > v
    y = v + 10;
elseif u == v
    y = u * 2;
else
    y = v - 10;
end

コメント付きの C コード

double ifstmt(double u, double v)
{
  double y;

  /* 'ifstmt:3' if u > v */
  if (u > v) {
    /* 'ifstmt:4' y = v + 10; */
    y = v + 10.0;
  } else if (u == v) {
    /* 'ifstmt:5' elseif u == v */
    /* 'ifstmt:6' y = u * 2; */
    y = u * 2.0;
  } else {
    /* 'ifstmt:7' else */
    /* 'ifstmt:8' y = v - 10; */
    y = v - 10.0;
  }

  return y;
}

for ステートメント

for ステートメント ヘッダーに対するコメントは、そのヘッダーを実装する生成コードの直前に挿入されます。このコメントは、生成コードの前にあるユーザー コメントの後に挿入されます。

MATLAB コード

function y = forstmt(u) 
%#codegen
y = 0;
for i = 1:u
    y = y + 1;
end

コメント付きの C コード

double forstmt(double u)
{
  double y;
  int i;

  /* 'forstmt:3' y = 0; */
  y = 0.0;

  /* 'forstmt:4' for i = 1:u */
  for (i = 0; i < (int)u; i++) {
    /* 'forstmt:5' y = y + 1; */
    y++;
  }

  return y;
}

while ステートメント

while ステートメント ヘッダーに対するコメントは、そのステートメント ヘッダーを実装する生成コードの直前に挿入されます。このコメントは、生成コードの前にあるユーザー コメントの後に挿入されます。

MATLAB コード

function y = subfcn(y) 
coder.inline('never');
while y < 100
    y = y + 1;
end

コメント付きの C コード

void subfcn(double *y)
{
  /* 'subfcn:2' coder.inline('never'); */
  /* 'subfcn:3' while y < 100 */
  while (*y < 100.0) {
    /* 'subfcn:4' y = y + 1; */
    (*y)++;
  }
}

switch ステートメント

switch ステートメント ヘッダーに対するコメントは、そのステートメント ヘッダーを実装する生成コードの直前に挿入されます。このコメントは、生成コードの前にあるユーザー コメントの後に挿入されます。case および otherwise 節に対するコメントは、その節を実装する生成コードの直後の、その節の中のステートメントとして生成されたコードの前に挿入されます。

MATLAB コード

function y = switchstmt(u)
%#codegen
y = 0;
switch u
    case 1
        y = y + 1;
    case 3
        y = y + 2;
    otherwise
        y = y - 1;
end

コメント付きの C コード

double switchstmt(double u)
{
  double y;

  /* 'switchstmt:3' y = 0; */
  /* 'switchstmt:4' switch u */
  switch ((int)u) {
   case 1:
    /* 'switchstmt:5' case 1 */
    /* 'switchstmt:6' y = y + 1; */
    y = 1.0;
    break;

   case 3:
    /* 'switchstmt:7' case 3 */
    /* 'switchstmt:8' y = y + 2; */
    y = 2.0;
    break;

   default:
    /* 'switchstmt:9' otherwise */
    /* 'switchstmt:10' y = y - 1; */
    y = -1.0;
    break;
  }

  return y;
}

トレーサビリティ タグの制限

  • MATLAB ソース コードは、以下に対してコメントとして含めることはできません。

    • MathWorks® ツールボックスの関数

    • P コード

  • コメントの外観と位置が異なる場合があります。

    • たとえば定数畳み込みなどにより実装コードが消去された場合でも、生成されたコード内にコメントが挿入されることがあります。

    • 関数またはコード ブロック全体が消去された場合、生成されたコードからコメントが消去される可能性があります。

    • 最適化によっては、これらのコメントが生成されたコードから分離される場合があります。

    • 生成コード内にソース コードのコメントを含めることを選択しなかった場合でも、生成コードは MATLAB ソース コードからの法的に必要なコメントを含みます。

関連するトピック