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社の登録商標です。
※記事内のサンプル等の流用にて損害等が発生したとしても、保証は一切致しません