トップページ > 過去ログ > 記事閲覧
構造体への代入がうまくいきません
名前:angelpias 日時: 2007/05/06 22:26

過去スレッドを見たのですが無かったようなので 新規で投稿させていただきます BCC Developer typedef struct{ int x; }sample_body; sample_body Sample[2000]; int set; for(set=0;set<2000;set++) Sample[set].x=set; と、プログラムを組んだ結果 Sampleのxはすべて0になっています いくらやっても代入できないので 申し訳ございませんがミスを教えていただけませんか?

Page: 1 |

Re: 構造体への代入がうまくいきません ( No.1 )
名前:キーチック 日時:2007/05/07 02:27

なんとなくですが, int set; の位置が悪いのではないかと思います. C言語の変数はブロックスコープという,プログラム中のあるブロックでのみ通用する変数定義が可能だったと思いますので,この場合, int set;  で宣言したsetと for(set=0;set<2000;set++)  で用いられているsetが別物で, さらにfor のループを抜けてからもとの int set;  で宣言したsetを使って Sample[set].x=set;  が実行されているのではないかなと言う気がします. (つまり,forのループはループしているだけ) この場合,int set;をWinMainの開始直後ぐらいのところで設定してしまうか,C++であることを考えて for(int set=0;set<2000;set++) { Sample[set].x=set; } のような記述に直せばとりあえず何とかなるような気がします. (ただ,私は変数は局所で定義しないようにする主義なので自信がありませんが…)
Re: 構造体への代入がうまくいきません ( No.2 )
名前:Sura 日時:2007/05/07 03:38

横レス失礼します。 私もBCCを用いているものです。 angelpiasさんのソースを以下のようにソックリ メイン関数の中に入れたプログラムでは正常に代入されていました。 キーチックさんの仰るスコープ違いによる不具合ではないのでしょうか? たとえば別のスコープからその構造体へのアクセスは一般にはできません。 おそらくすべて0であったことを考えるとstatic領域のsample_body型の変数を宣言し、 さらに別のスコープ(関数)でまったく同じ名前のsample_body型の変数を宣言し、 それに対して代入しているが、肝心のstatic領域の変数に代入されていない可能性です。 その場合、static領域のスコープにアクセスするには 変数名(ここでは Sample[i].x)の前にスコープ解決演算子::を 追加しなくてはなりません。 ご確認してみてください。 //test code 1:同じスコープの場合 #include <iostream> using namespace std; int main(void) { typedef struct{ int x; }sample_body; sample_body Sample[2000]; int set; for(set=0;set<2000;set++) Sample[set].x=set; //以下出力用のコード for(int i = 0; i < 2000; i++) cout << Sample[i].x << endl; return 0; } //test code 2:別スコープの場合(不具合) #include <iostream> using namespace std; typedef struct{ int x; }sample_body; sample_body Sample[2000]; int main(void) { sample_body Sample[2000]; int set; for(set=0;set<2000;set++) Sample[set].x=set; //以下出力用のコード for(int i = 0; i < 2000; i++) cout << Sample[i].x << "," << ::Sample[i].x << endl; //Sample[i].xはメイン関数内, ::Sample[i].xはstatic領域 return 0; } //test code 3:別スコープの場合(修正) #include <iostream> using namespace std; typedef struct{ int x; }sample_body; sample_body Sample[2000]; int main(void) { sample_body Sample[2000]; int set; //メイン関数内の変数に対する代入 for(set=0;set<2000;set++) Sample[set].x=set * 2; //static領域の変数に対する代入 for(set=0;set<2000;set++) ::Sample[set].x=set; //以下出力用のコード for(int i = 0; i < 2000; i++) cout << Sample[i].x << "," << ::Sample[i].x << endl; return 0; }
Re: 構造体への代入がうまくいきません ( No.3 )
名前:星樟八郎 日時:2007/05/07 21:31

あくまで自分の経験ですが、 例えば上のプログラムの場合、 for(set=0;set<2000;set++); Sample[set].x=set; と書いたりして(注:forの行の末に";"がある)、 forの文が空ループになってしまったということが、 そんなにしょっちゅうではないですが、たまにあったりしました。 ・・・どうでもよかったらすみません。

Page: 1 |