stlと申します。
コード上のif文などで、括弧が数百行にわたる大きなものの場合、どの括弧がどこに対応しているかを分かりやすく表示してくれる機能はe2 studioにありますか?
リカルドです。
include を上手に使えば、短く出来ます。
if 文の下に if 文が有って多重になっている時は、条件をよく検討すると、分かり易くなります。
A,B,C と三つの変数が有って、その組み合わせを if 文で判断していると複雑になります。A,B,C が YES/NO の2通りだったら最大8組の組み合わせです。3ビットの2進数に変換して、case文を使えば簡単です。case の中身が大きかったら関数を呼ぶか、include で別ファイルを差し込めば単純になります。
そういった方法があるのですね。
勉強になります。
> 3ビットの2進数に変換して、case文を使えば簡単です
リカルドさんはサラッと書いていますが、ちょっと追記させていただきます。
if 分は変数同士の比較、変数と定数の比較には使えます。case分は評価対象の変数がどの定数になったかを評価して処理を決めますのでif => caseへの変更には前提として条件分岐のもとになっている変数の見直しからやるのがいいのかなと思います。case分は事前に取りうる値が決まっているものと相性がいいのので変数が列挙型ならバッチリですね。
最初はある程度の処理内容くくりで意味のある関数名をつけて関数化がいいでしょうね。関数ジャンプのオーバーヘッドとか気になるかもですが、そんなのは組み込みの世界では最内周ループと割り込み優先度が高いもの、高頻度の割り込み処理にのみ注力してそれ以外はさして大きな影響はないです。あとコンパイラの最適化で関数はインライン化されたりもします。
もし、状態と処理が紐づいていて状態1→状態2→状態3・・・
状態1:処理1
状態2:処理2
・・・
のようなわかりやすい現状なら、状態を列挙型で定義して、列挙型の状態番号を0からフリ、処理をそれぞれ関数化、関数ポインタの配列に状態変数を与えて処理関数を個別呼び出しするとスッキリです。もちろん処理に紐付く変数のうち大域変数で埋め込んでしまったものの整理は必須ですよ。まずはリエントラントな構造へ修正ですね。場合によっては一時的な割り込み禁止の仕組みも必要です。
Yamamotoさん
>>最初はある程度の処理内容くくりで意味のある関数名をつけて関数化がいいでしょうね。
これはcase文で実行する処理を関数化した方が良いという意味でしょうか?
case文にするのは特に重要ではなく人の認識のできるモジュール単位に関数化すべきであるということです。場合によっては関数の中でさらに関数を呼び出す構造にしてもいいですし、処理が順番に実行されるなら、関数ポインタなどを使い順番に処理が切り替わる仕組みを導入するなども手です。
if文からcase文への変更は適している場合はそうすればいいですが、注意点としてcaseの条件は整数(マクロや列挙型を含む)であるということです。
理解出来ました。
お答えいただきありがとうございました。