【C言語】極度のめんどくさがりがプログラムの設計についての教えを請う【プログラミング作法・構造化プログラミング】
- morikentiger
- 16494
- 1
- 49
- 5
やることは、スコープを考えて変数を整理し直すことだな。けれど、スコープを、今のうちに聞いて理解しておこう。先の、グローバル、ローカル、staticの分け方はどうも曖昧なのか?それともdefine(単なる置き換え、一部関数的な使い方(マクロ))と一緒にしたのが間違いなのかな…
2014-10-26 22:11:25@zaklab @k2g2_ishikawa 現状、メイン関数や割り込み関数がある.cファイルに加え、走行関連・迷路探索関連・UI関連などで分けた「ヘッダファイル」があります。そこでは各機能関連のグローバル変数と関数が書いてあります。.hなのでインクルード順に注意してます。続く)
2014-10-26 22:24:41@zaklab @k2g2_ishikawa 続き) .hと.cが1セットというのを理解してないので、.hを分ける意義がわかってないと思います。どうして.hを分けるのでしょうか?それと.h.には自作関数を書くものだと思っていましたが、.hの使い方は違うのでしょうか?
2014-10-26 22:28:50@morikentiger @k2g2_ishikawa ヲイラがコードを書く場合、まず.cは関数のジャンル毎にファイル分離され、複数存在する。中には、メイン関数と初期化だけの.cなのてのもあるな。で、それぞれの.cに対し、同名の.hを用意する。(続き
2014-10-26 22:32:16@morikentiger @k2g2_ishikawa 各.hには、対応する.cに定義した関数、グローバル変数のうち、外部からアクセスして欲しいものだけを列挙する。defineとかenumも、外部で使いたいものは.h、内部オンリーのものは.cに定義する。(続き
2014-10-26 22:34:27@zaklab @k2g2_ishikawa 頭文字で型がわかると分かり易いですね!そうしてみます。ちなみにdefineがkってどういうことですか?double型と被るからですか?
2014-10-26 22:36:11@morikentiger @k2g2_ishikawa 別の.cに定義された関数を呼びたい.cは、その関数を列挙した.hをインクルードする。これで、どの.cがどの関数、グローバル変数を参照しているのかが明確になる。(続く
2014-10-26 22:36:39@morikentiger @k2g2_ishikawa また、全体的に共通で使うdefineやenumに関しては、別途.hを用意し、それをインクルードする。これで、概ね整理が済むんぢゃないかな。なお、あるコトをするとちょっとした問題が出るけど、それは出てからのお楽しみ(笑)。
2014-10-26 22:38:45@morikentiger @k2g2_ishikawa 型まで書いてると結構大変でっせ。それに、その辺はコンパイラがある程度はエラーで弾くので、意味合いとしてのグローバルかどうかと、固定値であるdefineかどうかが解れば良いかと。kなのは、通常数学での定数がkだからです。
2014-10-26 22:43:49@zaklab @k2g2_ishikawa enumは使ったことないですね。enum eDirection{eNORTH=0, eWEST=1, eSOUTH=2, eEAST=3};という型が作れるのですね。defineの.hがあるので、そこにenumも入れるといいですね。
2014-10-26 22:54:24@morikentiger @k2g2_ishikawa enumが便利なのは、typedef enumとして型定義に使えるという点です。当然、引数にも使えます。つまり、引数の型によって引き渡されるべき内容をある程度は絞れるのですね。間違った引数を書くと、警告されるハズですから。
2014-10-26 22:57:09@zaklab @k2g2_ishikawa そうですね。型違うとtype mismatchってでます。グローバルとdefineの区別にハンガリアン使います。定数のkですか、確かに。defineとconst型の使い分けってどうしてますか?
2014-10-26 23:09:19@morikentiger @k2g2_ishikawa defineとconstは大きな違いでっせ(^_^;)。具体的には、constには型が持てるコトと、組込の場合は(多くの開発環境において)その情報がROM内に確定するというメリットがありまする。
2014-10-26 23:16:26@zaklab @k2g2_ishikawa 大きな違いですね・・・。ROMに確定する。ポインタ参照みたいに、変数をコピーしなくて済むのはいいですね。 「型が持てること」は何がいいんですか?
2014-10-26 23:43:04@zaklab 一歩毎に、壁見て、歩数マップ再生成して、行動決定してます。その行動決定にしたがって、走り続けるか止まって旋回するか分けてます。
2014-10-26 23:46:39@zaklab @witch_kazumin @k2g2_ishikawa exturnを付けなくても、.cファイル間で勝手にリンクをしてしまうコンパイラがあるってことですか。そうなると、「同じ変数名」が意図せず、異なるファイルで更新されるんですね。ちなみにどういうケースでした?
2014-10-27 00:01:17@morikentiger こらこら、これまでナニを読んで来たのだ(^_^;)。型が持てれば、間違った時にコンパイラがエラーか警告にしてくれるではないか。defineでそんなコトできるかぃ?
2014-10-27 00:04:26@morikentiger ん?そうするとやはり走行そのものとは並行して思考ルーチンが動作するのかな。走ってる最中に決めるんだよね?
2014-10-27 00:05:47@morikentiger @witch_kazumin @k2g2_ishikawa 本来、全ての変数は事前に定義されてなければならないワケですが、Cの場合は仮の定義ってのがあって、環境によっては勝手に後で辻褄を合わせてしまうコトがあるんですよ。未定義の変数とか使ってると…ね。
2014-10-27 00:11:17@zaklab @morikentiger @witch_kazumin オイラが湯に浸かっていた間にずいぶんと盛り上がってるねえ(笑)
2014-10-27 00:13:16@zaklab @witch_kazumin @k2g2_ishikawa そんな理解で大丈夫か心配になったので、まとめました。文字が多いので、キャプチャです。この理解でいいでしょうか? pic.twitter.com/y6xUvLCp3u
2014-10-27 00:17:24@k2g2_ishikawa @morikentiger @witch_kazumin そろそろタッチ交代したいかも(^_^;)。
2014-10-27 00:17:56@morikentiger @witch_kazumin @k2g2_ishikawa ちょっと違う(^_^;)。実はグローバルにもstaticがある。staticしないグローバルは、ファイルを跨いで参照できるんだよね。で、.hにextern定義を書いておけば良いわけだ。
2014-10-27 00:21:15