DXライブラリで変数が変な値をとります。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
へるむ

DXライブラリで変数が変な値をとります。

#1

投稿記事 by へるむ » 12年前

私はいま人口をシュミレートするプログラムを作っています。プログラムは以下です

コード:

#include "DxLib.h"
#include <stdio.h>

int soujinkou=0;//変数宣言、総人口
int human[99999999][2];//個々のステータス、性別(0=男1=女),年齢,子供の数,存在しているか  一億が限界値
int i_w=0;//whileの回数かうんた
int i_f=0;//forの回数かうんた
int i_x=0;//配列に代入するようのかうんた
int i_y=0;//上に同じく
int i_f2;//for用2
int trun=0;
int rand_sex;
int rand_age;
int rand_chird;
int rand_deth;
int rand_alive;
int rand_tmp;
int rang_beborn;
int white=GetColor(255,255,255);
int type;//人口ピラミッドの型 0=富士山型(子供多老人少)1=つりがね(年齢の人口差少)2=つぼ(少子高齢)3=星形(子供少老人少大人多)4=ひょうたん(子供多老人=大人)


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
		
     

			switch (type){//ピラミッド型による仕分け

				case 0://富士山型の場合

					for (i_f2=0;i_f2<=99999999;i_f2++){
						human[i_f2][3]=0;
					}
						

						
							for (i_f2=0;i_f2<=13;i_f2++){//年齢性別はランダム決定 子供の数は0固定
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									
							}
						
						

							for(i_f2=14;i_f2<=25;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);

									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+5;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									
							}

													
	
							for(i_f2=26;i_f2<=35;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+10;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
								
							}

						
							for(i_f2=36;i_f2<=44;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+15;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
								
							}

							
							
							for(i_f2=45;i_f2<=52;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+20;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									
								
							}

								
								for(i_f2=53;i_f2<=58;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+25;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
								
							}

								
								for(i_f2=59;i_f2<=63;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+30;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
								
							}

								

								for(i_f2=64;i_f2<=69;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+35;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									
								}
								
							
								for(i_f2=70;i_f2<=74;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+40;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									
								}
							
								
								for(i_f2=75;i_f2<=79;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+45;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									
								}

							
								for(i_f2=80;i_f2<=84;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+50;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									
								}

							
								for(i_f2=85;i_f2<=89;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+55;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									D
								}

								
								for(i_f2=90;i_f2<=94;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+60;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									
								}

								
								for(i_f2=95;i_f2<=99;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+65;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
								
								}

							
								for(i_f2=100;i_f2<=103;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+70;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									
								}

								
								for(i_f2=104;i_f2<=106;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+75;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									
								}

								
								for(i_f2=107;i_f2<=108;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+80;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									
								}

								
								for(i_f2=109;i_f2<=110;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+85;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									
								}

							
								for(i_f2=111;i_f2<=112;i_f2++){
									rand_sex=GetRand(1);//乱数を設定
									rand_age=GetRand(5);
									human[i_f2][0]=rand_sex;
									human[i_f2][1]=rand_age+90;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									
								}
						
						
						DrawString(0,0,"初期配置が完了しました",white);
						WaitTimer( 3000 ) ;

						 while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
							 if(trun==0) soujinkou=100;
							
							 trun++;
							 rand_tmp=50;
							
							 if(trun%2==0) rand_tmp--;

							DrawFormatString(  0,  460, white , "%dターン目"   , trun  );//ターン数表示
							DrawFormatString(  0,  0, white , "%d人"   , soujinkou  );//総人口表示

							for(i_f=0;i_f<=soujinkou;i_f++){//死亡出生計算

								switch(human[i_f][1]){

								case 0:
								case 1:
								case 2:;
										if (human[i_f][3]!=0){
										rand_deth=GetRand(99);//100の乱数をそれぞれ指定し、合致したら死ぬ。
										for (i_f2=0;i_f2<=rand_tmp;i_f2++){
											rand_alive=GetRand(99);
											if (rand_alive==rand_deth){
												human[i_f][3]=0;
												soujinkou--;
												break;
										}
										}
								}

								}

							}

							WaitTimer(500);
						 }
	
					
				case 1:

				case 2:
					
				case 3:

				case 4:;
					
				}

		DxLib_End(); // DXライブラリ終了処理
        return 0;

		}
見づらいプログラムで申し訳ありません。
このプログラムで、human[x][3]の変数が1か2しか代入していないはずなのに突然5などになって困っています
原因わかる方いませんでしょうか?
ちなみにプログラムはまだ始めたばかりです。
環境はWindows7、VC++です。

box
記事: 2002
登録日時: 14年前

Re: DXライブラリで変数が変な値をとります。

#2

投稿記事 by box » 12年前

へるむ さんが書きました:私はいま人口をシュミレートするプログラムを作っています。
simulateという単語の読みは、おそらく「シミュレート」の方が正しいでしょう。
さて、
へるむ さんが書きました:

コード:

int human[99999999][2];//個々のステータス、性別(0=男1=女),年齢,子供の数,存在しているか  一億が限界値
2番目の添字が[2]ですから、
へるむ さんが書きました:

コード:

						human[i_f2][3]=0;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
									human[i_f2][2]=0;
									human[i_f2][3]=1;
										if (human[i_f][3]!=0){
												human[i_f][3]=0;
上記のコードは配列の定義範囲外の領域にアクセスしています。
変な動きをして当然でありましょう。

また、「一億が限界値」と言っているのに、配列の1番目の添字が99999999なのはどうしてなんでしょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DXライブラリで変数が変な値をとります。

#3

投稿記事 by softya(ソフト屋) » 12年前

int human[99999999][2]と宣言されていますので、human[0から99999998][0から1]以外の場所を指すと配列範囲外に成ります。他の変数の値を壊しているんじゃないでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

へるむ

Re: DXライブラリで変数が変な値をとります。

#4

投稿記事 by へるむ » 12年前

回答有難うございました。
皆さんのおかげで無事解決しました!
初歩的なミスでお恥ずかしいです。

閉鎖

“C言語何でも質問掲示板” へ戻る