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)