Mスクリプトを使用したCソースコーディング
モデルからオートコードするほどでもないし、ハンドコーディングするのも手間だな
という時に、MスクリプトからCソースを生成していました
作成頻度としては、それほどないのですが、地味に有効なので
今回は、Mスクリプトから簡単なCソースの作成方法を説明します
例として、下記のサンプルCコードをMスクリプトで自動生成したいとします
サンプルCソース(test.c)
#include
main(void){
int AAA = 100;
int BBB = 200;
}
実現手法はいくつかあるのですが、
一番簡単な方法だと、以下のベタ書きのMスクリプトで実現できます
fileID = fopen('test.c','w');
fprintf(fileID,'#include \n\n');
fprintf(fileID,'main(void){\n');
fprintf(fileID,'\tint AAA = 100;\n');
fprintf(fileID,'\tint BBB = 200;\n');
fprintf(fileID,'}\n');
fclose(fileID);
かなり簡単ですよね
一応、使用しているAPIを説明しておくと、
fopen
ファイルを開いたり、ファイルを新規作成するためのAPIです
ライト時は’w’のオプションが必要なのが注意点です
fprintf
ファイルに文字列をライトするためのAPIです
fclose
ファイルを閉じるためのAPIです
これを実行しないと、ずっとファイルが開いたままになるため、必ず最後に実行します
細かいことは、公式HPをご覧ください
https://jp.mathworks.com/help/matlab/low-level-file-i-o.html?s_tid=CRUX_lftnav
\n、\tは特殊文字と言います(エスケープ文字とも言う)
\nは改行、\tはタブを表しており、それ以外にも沢山ありますが、こちらも公式HPをご覧ください
https://jp.mathworks.com/help/matlab/matlab_prog/formatting-strings.html
このように、ただ書くだけなら3つのAPIを使用するだけで、ファイルを作成することができます
応用編
ベタ書きだと面白くないので、変数と値をパラメータ化してみたいと思います
例えば、変数名(AAA、BBB)と値(100、200)をパラメータ化したいとします
これもいくつか方法があるのですが、今回は簡単な例としてセル配列(temp)に情報を格納します
これを先ほどのMスクリプトに組み込むと、以下のようになります
temp{1,1}='AAA';
temp{1,2}=100;
temp{2,1}='BBB';
temp{2,2}=200;
fileID = fopen('test.c','w');
fprintf(fileID,'#include \n\n');
fprintf(fileID,'main(void){\n');
for i=1:length(temp)
temp_name = temp{i,1}
temp_value = temp{i,2}
fprintf(fileID,'\tint %s = %s;\n',temp_name,num2str(temp_value));
end
fprintf(fileID,'}\n');
fclose(fileID);
12~16行目にFor文処理を入れることで、セル配列に格納されている情報(長さ)によって、
柔軟にコーディングできるスクリプトにしてみました
※数値データを文字列として扱いたい場合は、num2strを使用します
この処理を入れないと、文字コードとして扱われるため、数字が意図しない文字に変換されます
今回はコードを中心とした説明で分かりづらい点があったかもしれませんが、
Mスクリプトで文字列を扱うのが意外と簡単だと、分かって頂けたかと思います
機会があれば、是非活用してください
——————————————
※MATLAB, Simulinkは、MathWorks社の登録商標です。
※記事内のサンプル等の流用にて損害等が発生したとしても、保証は一切致しません