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

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

@morikentiger @k2g2_ishikawa 割り込みに「渡す」情報はグローバルにいないとアカンけど、単に保持したいだけなら関数内static変数でオケ。これで本当に必要最小限のグローバル変数に絞れるんぢゃないかな(^_^)。

2014-10-26 19:21:42
黒白虎もりけん☆楽しんだもの=「価値」 @morikentiger

話を整理しないとわからんというか、知識が追っついてないぞ

2014-10-26 19:44:18
黒白虎もりけん☆楽しんだもの=「価値」 @morikentiger

@zaklab @k2g2_ishikawa 大体中途半端にしかわかってないので、聞いてもいいですか? まず、スコープを切る?コンパイラを活用とはどういうことですか?

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

@morikentiger @k2g2_ishikawa C言語かその派生でコードを書いているという前提で書きますが(笑)、スコープってのは「ある識別子が見える範囲」です。グローバルならシステム全域、ローカルなら関数内ですが、実は他にもスコープは存在するんですな。

2014-10-26 19:58:13
吉日 @k2g2_ishikawa

@morikentiger @zaklab スコープというのは変数の有効範囲です。変数を宣言する場所に応じてその変数を参照、更新出来る場所が決定します。グローバルとかローカルというのがスコープです。同じ変数名でもスコープが違えば宣言できます。まぁ同名の変数なんてバグの原因だけどね

2014-10-26 19:59:30
黒白虎もりけん☆楽しんだもの=「価値」 @morikentiger

@zaklab この機会に勉強しますので、質問お願いします!!!

2014-10-26 20:00:13
黒白虎もりけん☆楽しんだもの=「価値」 @morikentiger

「【C言語】極度のめんどくさがりがプログラムの設計についての教えを請う【プログラミング作法】」をトゥギャりました。 togetter.com/li/737091

2014-10-26 20:16:03
Zak@Chiba @zaklab

@morikentiger @k2g2_ishikawa あえて変数と書かず識別子と書いたのは、「関数名もまたスコープを持ち得る」からです。1つのファイルにダラダラと全部の関数を書くのではなく、ジャンル毎に分類して別々のファイルにし、そこでだけ使う関数をstaticにするとかね。

2014-10-26 20:03:51
Zak@Chiba @zaklab

@morikentiger @k2g2_ishikawa で、そういう「整理整頓」をやったコードというのは、コード間の依存性が下がり、他の影響で別のトコロがコケるとかが発生しにくくなります。まずは最低限、そういった整理をするのが先決かと。

2014-10-26 20:16:49
Zak@Chiba @zaklab

@morikentiger @k2g2_ishikawa で、実はこの考え方を突き詰めて行くと、自然にオブジェクト指向に行き当たったりします(笑)。

2014-10-26 20:18:50
黒白虎もりけん☆楽しんだもの=「価値」 @morikentiger

@zaklab @k2g2_ishikawa c言語です。すみません、何の言語の話か言ってませんでした。

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

@morikentiger @k2g2_ishikawa あと、いわゆるマイコンの組込系なのか、OS上のアプリ系なのかでも、コードの書き方は大幅に違うんだけど…多分、組込系だと思ってるんだけど違う?

2014-10-26 20:21:30
黒白虎もりけん☆楽しんだもの=「価値」 @morikentiger

@k2g2_ishikawa グローバルかローカルか、それを考えておくのも設計のうちなのですね。

2014-10-26 20:24:09
Zak@Chiba @zaklab

@morikentiger @k2g2_ishikawa であれば、たぶんコーディングの前に一つ考えておかねばならんコトがある。それは思考ルーチンをどこで走らせるか、だね。走行と並行させるか否かと言ってもいい。当然、並行させる方が難易度は上がるよ(^_^;)。

2014-10-26 20:26:49
黒白虎もりけん☆楽しんだもの=「価値」 @morikentiger

@zaklab @k2g2_ishikawa 確かに・・・。今のコードは、グローバルかローカルかdefineかわかりづらく書いていますね・・・。それのせいでバグが発生し、デバッグに苦労しました。もしかしたらまだバグが残っているのかも・・・。

2014-10-26 20:28:58
Zak@Chiba @zaklab

@morikentiger @k2g2_ishikawa 賛否はあるんだが、「ハンガリアン記法」ってのがある。ヲイラの場合、グローバル変数は小文字のgで始まり、大文字始まりの英単語になってる。例えば「gPosition」みたいな奴ね。defineは同様にk始まりだな。

2014-10-26 20:33:06
Zak@Chiba @zaklab

@morikentiger @k2g2_ishikawa wikiにあるような厳密なハンガリアンは面倒なだけやけど、グローバルとdefineだけこうしとくと、結構有用だと思いますよ。

2014-10-26 20:34:02
Zak@Chiba @zaklab

@morikentiger @k2g2_ishikawa コンパイラの有効活用として時々やるのが、findを使わずに変数名を変更していくコトだったりします。定義を変更してコンパイルして、エラーになる場所から順番に変更してみると、なぜか残る奴が出たりするんだよね(笑)。

2014-10-26 20:37:46
黒白虎もりけん☆楽しんだもの=「価値」 @morikentiger

@k2g2_ishikawa @zaklab プログラムのどこででも参照できるのがグローバル、その関数内でしか参照できないのがローカルということですね。確かに、同名の変数はわかりづらい、バグになりますね・・・。

2014-10-26 20:39:51
Zak@Chiba @zaklab

@morikentiger @k2g2_ishikawa もちろん、先にコンパイルが通るのを確認した上で、変数を一つだけ変更しないと混乱するんだけど、誤ってローカルにグローバルと同じ変数を定義してたりするのは、これで炙り出せるかな。無論、g始まりに変更すればナオヨシ。

2014-10-26 20:40:06
黒白虎もりけん☆楽しんだもの=「価値」 @morikentiger

@zaklab @k2g2_ishikawa 識別子=「変数、関数の名前」なのですね。グローバルとローカル以外のスコープとはなんでしょう?さっきから話題にあるファイル間やりとりに関係することでしょうか?

2014-10-26 20:44:41
Zak@Chiba @zaklab

@morikentiger @k2g2_ishikawa enum, defineしたのも識別子な(^_^;)。グローバルにも幾つかあって、複数ファイルを跨いでグローバルなものもあれば、ファイル内でだけ有効なグローバルもあります。ローカルにしても関数内の局所でしか使わないのも。

2014-10-26 20:47:30
前へ 1 2 ・・ 5 次へ