プログラムが長くなり。。。。

アバター
せんちゃ
記事: 50
登録日時: 15年前
住所: 江別市東野幌町
連絡を取る:

プログラムが長くなり。。。。

投稿記事 by せんちゃ » 14年前

最近かいているプログラムがどんどんと長くなっていき、
意味不明なことが度々起こるようになりました。

例えば
・グローバル変数をヘッダーファイルで宣言しているのに
(ちゃんとif definedで条件付きにしてメインと別のファイルでexternをかけていますよ!)関数で使うとエラーになる(未解決のシンボルとかそんな名前で)

・変数一個追加しただけでプログラムがイカれる

・画像を配列に入れているのに表示されない

・初期化関数とロード関数の順番が違うと処理が変わりだす

などなど…
なんだか変数を追加するのが怖くなってきましたw


原因がよくわからなかったので先生に相談

ボク「変数を宣言しただけでプログラムの動作がおかしくなることってありますか?」

先生「そういうのはあるよ。」

ボク「メモリとかそういうのの関係ですかね?」

先生「いや~プログラム見てみないとなんとも言えんわ~」

まぁそんな感じです。

そして先生からさらに
「たぶんこれからもそういうの増えると思うよ。」
との一言…
「長いプログラム書いてるとどんどんとそういうの増えるよね、
forループで配列回すときに本当なら10個の配列のはずが11個だったり9個だったり、forの回す回数とかもけっこう馬鹿にできないよ。イコールが付くか付かないかでも大分意味変わるし。あとはポインタとかで変なところ差したりしてバグの原因になるだとかも有り得るよ。」
というアドバイスをいただきました。

for文は一回読み返して、各配列の要素は全部defineでまとめたり、
いろいろしてみましょうかね。


プログラムって難しいなぁ~

アバター
SAI
記事: 115
登録日時: 14年前

Re: プログラムが長くなり。。。。

投稿記事 by SAI » 14年前

共感できることが多すぎるw

未解決のシンボル!
私も何十回悩まされたことか・・・。
確かあの時はどうやって解決したっけな・・・(オイ
確かグローバルで宣言してなかったのが原因だった気がします。って役に立ってませんね。すいません。

あと変数を追加しただけでイカレることもよくありました!
あの時は起動時に応答なくなったり、謎の挙動をしたり、意味不明でしたね・・・
確か原因は、すでにあるのと同じ変数名を宣言すると、よりローカルな方が優先されて使われるとか、forの上限を間違えることによるメモリ破壊(多分)でしたね。

画像が表示されないなんて日常茶飯事です。何が原因かはデバッグして確かめてます。

いやホント、プログラムって難しいですよね。

アバター
せんちゃ
記事: 50
登録日時: 15年前
住所: 江別市東野幌町
連絡を取る:

Re: プログラムが長くなり。。。。

投稿記事 by せんちゃ » 14年前

SAIさん
コメントありがとうございます!^^
未解決のシンボルはかなりの曲者でして、
一回起こって先生に「みてくださいよ~」と相談した
次の瞬間に何故かどこもいじっていないのにエラーが消えだしたり。。。。(先生に笑われて恥ずかしかったですw)

グローバルとローカルで同じ変数名…
もしかしてあるかもしれません(汗


画像が表示されないのは時間が経つと治っていたり、
治っていなかったり、
なぜか変数の初期化する値を変えたら治っちゃったり…

なかなかの困ったちゃんですが、そういう現象が起こることは別に変なことじゃないような気がしてきて最近は

「またかよ~^^;」

って感じで慣れてきちゃいましたw

ISLe
記事: 2650
登録日時: 15年前

Re: プログラムが長くなり。。。。

投稿記事 by ISLe » 14年前

あまり使っている人がいない特定用途のプラットフォームだとコンパイラにバグがあったりしますよ。
でもコンパイラが修正されるのをマスターアップは待ってくれないのでなんとかバグを回避して仕上げるしかないのです。
正しいプログラムを書く以上の特殊技能が必要なのです。

K#
記事: 1
登録日時: 15年前

Re: プログラムが長くなり。。。。

投稿記事 by K# » 14年前

私も似たような状況に出くわすことが多いです。

C言語ですとチェックがあまいですからね。
常に疑ってかかること、短く共通化して、コードを無駄に増やさないことが大切だと思います。

バッファオーバーランのバグを見つけるのにまる一日使ったのは苦い思い出です。

くじけずにやりましょう。

アバター
へろりくしょん
記事: 92
登録日時: 15年前

Re: プログラムが長くなり。。。。

投稿記事 by へろりくしょん » 14年前

これら一連の現象は、プログラムがスパゲッティ化している予兆のような気がします。

まず、ソースコードの臭いに、危機感を持つ事が大切だと思いますよ。

構造化を意識して、printf() は文字の出力、scanf() は入力。 みたいに1関数1機能を心がけ、関数はあくまでもただの道具、という認識を持つこと。

後は、モジュールやオブジェクトの依存関係をあまり複雑にしない事。
出来れば、階層的に上流から下流へ一直線に並ぶようにするのが望ましいです。

これを守るだけで、結構すっきりしますよ。

アバター
せんちゃ
記事: 50
登録日時: 15年前
住所: 江別市東野幌町
連絡を取る:

Re: プログラムが長くなり。。。。

投稿記事 by せんちゃ » 14年前

>ISLeさん
コメントありがとうございます!
ボクの使用しているコンパイラはVisualStudioの2008です。コンパイラ側に問題があるかは別としても
ここ一連の現象はどうも自分が原因のようなきがして
なりません^^;

K#さん
コメントありがとうございます!
凡庸性のあるプログラムはどんどんと関数化
していくのが大事なんだなということに気が付いてきました^^;

へろりさん
コメントありがとうございます!
いろんなところで静的なローカル変数を宣言したり、
関数のおき場所もメチャクチャ…
処理も無駄が多いなぁと自分のプログラムを読んでいて
毎回感じていました^^;

ちょっと試しにオブジェクト指向にして書いてみたのですが
それだけでもだいぶ、関数、変数、オブジェクトをまとめることができてサッパリして綺麗になったような気がします。
(変数の管理もやりやすく感じました)

変数と関数の管理を意識したうえでこれからは
プログラムに注意していこうと思います!