Main Content

MATLAB 文字列および文字の行ベクトルからの C/C++ 文字列の生成

既定では、MATLAB® 文字列および文字の行ベクトルは、生成されたコードでは C/C++ 文字配列にマッピングされます。MATLAB 文字列または文字の行ベクトルから C/C++ 文字列を生成するには、MATLAB 文字列または文字の行ベクトルは null で終了しなければなりません (ゼロ、0 で終了)。たとえば、文字列 "Hello World"+char(0) および文字の行ベクトル ['Hello World', 0] は null で終了しています。

MATLAB 文字列または文字の行ベクトルが null で終了していない場合、たとえば 'Hello World' のような場合、MATLAB 文字列は生成された C/C++ コードでは文字配列 { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd' } にマッピングされます。

MATLAB で、次の関数を考えてみます。

function t = CharArrayNullAtEnd()
    t = ['Hello World',0]; 
end 

この関数に対して生成される、対応する C/C++ コードは次のようになります。

void CharArrayNullAtEnd(char t[12])
{
  int i;
  static const char cv[12] = "Hello World"; 
  for (i = 0; i < 12; i++) {
    t[i] = cv[i];
  }
}

文字配列ではなく C/C++ 文字列を生成することで、生成されるコードの可読性が向上します。

メモ

文字の長さが LoopUnrollThreshold よりも小さい場合、二重引用符で囲まれた C/C++ 文字列は、null で終了している場合であっても、コードでは生成されません。代わりに、コード ジェネレーターは個別の文字の代入をもつ C の文字配列を生成します。既定では、LoopUnrollThreshold に代入される値は 5 です。ループ展開の詳細についてはfor ループおよび parfor ループの展開を参照してください。

生成されたコードでの文字列への改行の追加

null で終了する MATLAB 文字列または文字の行ベクトルから C/C++ 文字列を生成するときは、関数 newline を MATLAB 文字列または文字の行ベクトルで使用します。コード ジェネレーターは、関数 newline を生成されたコードで改行文字 '\n' にマッピングします。MATLAB コードで文字 '\n' を代わりに使用すると、この文字はエスケープ処理されて、生成されるコードでは '\\n' にマッピングされます。

MATLAB で、次の関数を考えてみます。

function StringNewline()

    string1 = ['Hello World' 0];
    string2 = ['My MATLAB' 0];
    formatSpecifier = ['%s' newline 0];
    coder.cinclude('<stdio.h>');
    coder.ceval('printf',coder.rref(formatSpecifier),coder.rref(string1));
    coder.ceval('printf',coder.rref(formatSpecifier),coder.rref(string2));
    
end

この関数に対して生成される、対応する C/C++ コードは次のようになります。

void StringNewline(const emlrtStack *sp)
{
  static const char_T formatSpecifier[4] = "%s\n";
  static const char_T string1[12] = "Hello World";
  static const char_T string2[14] = "My MATLAB";
  (void)sp;
  printf(formatSpecifier, string1);
  printf(formatSpecifier, string2);
}
MATLAB 関数 StringNewline で、formatSpecifier'%s\n' (['%s' newline 0] ではなく) である場合、文字 '\n' はエスケープ処理され、生成される C/C++ コードでは {'\\','n'} となります。

制限

複数の null を含む MATLAB 文字の行ベクトル (たとえば ['Hello', 0, 0]) は C/C++ 文字列の生成でサポートされません。

参考

| | | | |

関連するトピック