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);
}
StringNewline で、formatSpecifier が '%s\n' (['%s' newline 0] ではなく) である場合、文字 '\n' はエスケープ処理され、生成される C/C++ コードでは {'\\','n'} となります。制限
複数の null を含む MATLAB 文字の行ベクトル (たとえば ['Hello', 0, 0]) は C/C++ 文字列の生成でサポートされません。
参考
codegen | coder | coder.config | newline | coder.rref | coder.ceval
トピック
- string のコード生成
- ループ展開のしきい値 (Simulink Coder)