【C言語】極度のめんどくさがりがプログラムの設計についての教えを請う【プログラミング作法・構造化プログラミング】

現在、C言語でマイクロマウスの開発をしているプログラミング初心者(@morikentiger)が、プログラミングの作法(とくに変数の扱い)について教えを請う。構造化プログラミング、変数のスコープ(有効範囲)や記憶域期間(staticだと永久に保持されるなど)について。
7

プログラムの設計について

もりけん@移り変わる流れの中で @morikentiger

極度のめんどくさがりだから、プログラムはなるべく書き直したくないし、バグにはウンザリ(というほどやってないけど)…。そこで、根本的にプログラムの設計をどうやったら「書き直しを抑えられるか、そもそもこの考えじゃダメじゃね?にならないか」を知りたい。

2014-10-26 13:18:01
吉日 @k2g2_ishikawa

@morikentiger 紙面上で詳細設計をガリガリやれば駄目な部分は色々見えてきます

2014-10-26 13:22:06
もりけん@移り変わる流れの中で @morikentiger

@k2g2_ishikawa プログラムの流れを書いて整理するんです!変数やフラグの管理(更新タイミング,引数orグローバルにするなど)はどうされていますか?

2014-10-26 14:24:19

そもそも、なぜこのまとめができたのか

今まで「とりあえず書いてみる精神」で行き当たりばったりにプログラムを書いていたが、当然ちゃんと動かないバグに悩ませられたり、そもそもプログラム設計しておらず、非常に使いにくいプログラムになっていた。そこで、なるべく書き直しにならないように、慎重にプログラムの設計をしようと決意する。そこで問題になるのが、「変数の管理」…。

↓未だに謎の現象…。もしかすると、このまとめ通りにやれば解決するかもしれない
もりけん@移り変わる流れの中で @morikentiger

区間走る関数の中に加減速関数をいれると、最低速のまま加減速しないという謎のバグは、プロトタイプ宣言をすることによって解消された・・・。だが、なぜ、プロトタイプ宣言しなくても動く関数もあるのに、プロトタイプ宣言しないと動くのに正しい挙動ではなくなるのか・・・。

2014-10-04 14:30:55

二輪ロボットの加減速が上手くいかず数ヶ月・・・

もりけん@移り変わる流れの中で @morikentiger

しかも、最初超新地旋回するまでの直進加減速はちゃんと距離があう。なのに、旋回後、挙動がおかしくなる。うなりを上げてるから、速度が波打ってるんだろうと思うんだけど・・・。

2014-10-07 02:18:59
もりけん@移り変わる流れの中で @morikentiger

やっと左手でゴールした…。距離がおかしかった原因は、直進時に角速度も加減速しててスラロームになっていたことだった。

2014-10-07 05:01:48
もりけん@移り変わる流れの中で @morikentiger

なお、ゴール座標の周りを1で埋めて終了する模様orz それに加えて、シリアル通信が無限ループしてんのおわんないし(実は無限ループに見せかけて・・・。いや、マップのY座標がマイナス(というか255にアンダーフロー・・・)座標表示はおかしいっしょ・・・。

2014-10-09 03:06:48
もりけん@移り変わる流れの中で @morikentiger

スタートに戻れないのは、謎の歩数2の壁が存在するからだった。なんなんだー。今朝はこのバグをどうにかしよう。 pic.twitter.com/bBCk8Rlf18

2014-10-15 07:01:55
拡大
もりけん@移り変わる流れの中で @morikentiger

最初に見るのが(1,0)ゴールじゃん…。横着して直接(0,0)指定するから… START_X,Yとかdefineすりゃよかったのか

2014-10-15 07:48:37
もりけん@移り変わる流れの中で @morikentiger

うわー。超新地の角度が計算と全く合わない原因がわかったー。

2014-10-18 11:08:11
もりけん@移り変わる流れの中で @morikentiger

min_speedという速度下限を設けていたが角度と分けてmin_ang_speedという変数を追加して、重心速度と角速度を分けたはずなんだけど、実際は、重心速度と角速度を合成して、左右のモーターの速度に変換する際に、速度下限を設けていて、そのせいで上手く行かなくなっていた

2014-10-18 11:13:05
以上のような、バグに苦しめられて、コーティングが思うように進まなかった…。

話は戻って、C言語でのプログラムにおける変数のスコープ(有効範囲)について

吉日 @k2g2_ishikawa

@morikentiger 変数はグローバルにすると、どこからも参照、更新可能になり思いがけないバグの温床になるので、呼び出し先が必要とする値だけを引数で渡すようにしています。渡す引数が多いときは構造体化して渡すとかしてます。

2014-10-26 15:05:07
もりけん@移り変わる流れの中で @morikentiger

@k2g2_ishikawa グローバルはバグの温床か・・・。極力減らす方向で設計しようと思います。そういえば割り込み関数に渡す場合は、グローバルじゃないといけませんよね・・・。1ms毎に割り込みで物理計算する変数はグローバルじゃないといけない?割り込みの使い方間違ってますか?

2014-10-26 19:10:20
Zak@Chiba @zaklab

@morikentiger @k2g2_ishikawa まず、ヲイラがやってる工夫の一つ「グローバル変数は変数名自体がグローバルであるコトが解るように命名する」を実践してみるヨロシ(^_^;)。これだけでも、思わぬ場所で誤ってグローバル変数をイジってしまってるのが解ったりする。

2014-10-26 19:17:06
吉日 @k2g2_ishikawa

@morikentiger 何がなんでもローカル変数という考え方はプログラムを読みにくくします。必要最小限(自分が把握、管理できる範囲)なグローバルはアリです。グローバル変数を更新するカ所を絞れる組み方をしてればバグも発見が早いです

2014-10-26 19:18:49
Zak@Chiba @zaklab

@morikentiger @k2g2_ishikawa 次に、スコープを上手に切ってコンパイラを有効活用すべし。ローカルで済む物は全てローカルに。static変数や関数を有効利用。ファイルも分割してファイル内オンリーな変数とか使って、システム全体に渡るグローバル変数を極力削減。

2014-10-26 19:19:25
残りを読む(97)

コメント