ページ 11

変数の数について

Posted: 2009年5月26日(火) 02:35
by はいかぜ
こんばんは。
久々の質問になるのですが、どうしても分からないことがあるのできました。

こちらの環境は、
OS:WinXP SP3
コンパイラ:VisualC++2008
ライブラリ:DXライブラリ
です。

質問内容は、
「上記のような環境で変数の数に制限があるのかどうか」です。

現在、試しにプログラムを作っていて新しく変数を追加したのですが…
その変数を追加したら全ての動作がおかしくなってしまう(画像の表示や変数の値が主)という状況に陥っています。
試してみたことが、
1.変数の名前を変える。
2.今ある変数をひとつ消して、新たにひとつ追加する。
です。

1のほうだと症状は変わらないのですが、2のほうだとちゃんと動作しました。
このようなことから、数の制限があるのかどうかという疑問に至りました。

変数に数の制限はあるのでしょうか?
変数の型は「int」です。
また、このような症状の解決策はあるのでしょうか?

説明に曖昧な部分があって申し訳ないのですが、
どうかよろしくお願いします。

Re:変数の数について

Posted: 2009年5月26日(火) 06:35
by Dixq (管理人)
ローカル変数において、制限はありますが、そのような動作にはならないと思います。
どこかでオーバーフローとかおこして他の変数の値までかわってしまっているのでは無いでしょうか?
その変数の宣言はただの引き金になっているだけで、バグの正体はそこではないという可能性もあるかもしれません。
具体的にどのような宣言をしたのか詳しく教えてもらえると何かわかるかもしれません。

とりあえず、他の配列やポインタ関係でおかしな場所を指していないか、代入していないかザッと調べてみてはいかがでしょうか。

Re:変数の数について

Posted: 2009年5月26日(火) 06:37
by 山崎
おはようございます。

確か、「変数の数に制限があるかどうか」と聞かれたら、それは「YES」のはずですね。
当然ですが、パソコンのメモリの量には限界がありますので、
ひとつのプログラムが使用できるメモリにも限界があります。
でも、その変数の限界まで使い切る、ってのはかなり大変なのでは思いますね。
intは大抵4バイトですから、intだけでメモリを使い切るとなると相当大量に宣言しなければなりません。

お話を伺った感じですと、おそらく自動変数という形で変数を宣言しておられますよね。
もし非常に大量に変数が必要なら、newやallocを使って動的に変数の領域を確保したほうがいいと思います。
(私はまだC++上級者じゃないので詳しいことを説明するのは遠慮しておきます)

エラーのほうですが、私には何となく変数の数以外の原因があるように思えます・・・。
もしエラーを取り除きたいのであれば、とりあえず、
そのエラーが起こるコードを載せてみてはいかがでしょうか?

Re:変数の数について

Posted: 2009年5月26日(火) 06:42
by チルチル
私は弾の構造体を百万個宣言したことがありますが少し重くなっただけで
ちゃんと動作しました、まあ構造体配列の話ですが
変数はメモリの容量が許す限り数に制限はないと思います

ちなみに
>>1.変数の名前を変える。
これは特定の変数の場合ですか?
それともどの変数でも同じ結果になりますか?

>>2.今ある変数をひとつ消して、新たにひとつ追加する。
変数をひとつ消して、新たにふたつ追加したらどうなりますか?

このような症状が出る原因としては
グローバル変数とローカル変数で同じ名前が使われている
ことぐらいしか思い浮かびませんが
どうしてもダメだったら変数名を変えて続けてみてはどうですか?

って言うかキーを打っている間に先に投稿されていましたね
すいません聞き流して下さい・・

Re:変数の数について

Posted: 2009年5月26日(火) 09:51
by Mist
他の方がおっしゃられているように今回の原因はプログラムのどこかでメモリ破壊を起こしている事が原因と思います。
一応、ローカル変数(スタック変数)は特に何も設定していなければ最大1MB(だったと思う)という制限はありますが、スタックオーバーフローを起こした場合はWindowsがメッセージボックスで通知してくれるのですぐにわかります。

Re:変数の数について

Posted: 2009年5月26日(火) 16:08
by はいかぜ
Dixq (管理人)さん
こんにちは。
ご回答ありがとうございます。
オーバーフローという単語が出てきて少し調べてみたら、
別な変数でいじっていないはずなのに変更されている部分があったのでこれではないかと思い、
ご指摘のとおり少し調べてみました。

そしたら、fwriteの書き込みデータの数の項を変更してみるとちゃんと動いてくれました。
fwiteのこのような部分も影響を及ぼすものがあるのですか…

山崎さん
こんにちは。
ご回答ありがとうございます。

なるほど、制限はあるだろうけれどもその制限にはまず引っかからないということですか…
コードについてはエラーコードはなく動いてくれるのですが、その動作がおかしくなるというものでした。
今回のことに関しては、とりあえず解決することはできました。
これから先また起こるかもしれないとなると少々不安ですが^^;

チルチルさん
こんにちは。
ご回答ありがとうございます。

なんと100万・・・
少々数が増えてきたとは思っていましたがそこまでいって大丈夫なら杞憂に過ぎないということですね^^;
ご指摘の変数が同じ名前というのは見当たらなかったです。
また、intではなくchar型の変数を追加した場合でも同じ症状が出ました。

Mistさん
こんにちは。
ご回答ありがとうございます。

なるほど…
やはり、メモリのことも考えないといけないのですね^^;
そういった部分にあまり気を遣ってはいなかったのでこれからは気をつけます。
皆さんのご指摘を受けてメッセージボックスが出たのですが、その意味がわからず。
けれどもそれを基にして、なんとなく数字をいじってみたら解決されたという状況でした。
ちなみに、エラーボックスはこのようなものでした。