配列型構造体の数値代入について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
夢猫。
記事: 28
登録日時: 9年前

配列型構造体の数値代入について

#1

投稿記事 by 夢猫。 » 9年前

背景表示の構造体に配列型構造体を使用しているのですが、stbtという名前の構造体の0番以外の配列に値を代入することができずに困っています。原因の究明をしたいので、ソースコードの間違いの指摘をお願いいたします。

コード:

#include "../resource/dxlib/DxLib.h"
#include <stdio.h>
#include <math.h>
#include "../header/stageback.h"
#include "../header/mode.h"

#define PI 3.141592
#define STB_MAX 20
#define STBNUM_MAX 21

typedef struct{
	float x,y;
	float u,v;
}stp_t;
stp_t stp[6]={{-1,1,0,0},{1,1,1,0},{-1,-1,0,1},{1,-1,1,1},{-1,-1,0,1},{1,1,1,0}};

typedef struct{
	float x,y,z;
	VERTEX3D stbv[6];
}stbc_t;

int stbz;

typedef struct{
	int Img;
	int Imgsi;
	int Imgx1;
	int Imgx2;
	int Imgy1;
	int Imgy2;
	int Type;
	int sidlo;
	float six,siy;
	float fromz,toz;
	float fadfromz,fadtoz;
	float zhaba;
	float angl;
	int resetf;
	stbc_t stbc[STB_MAX];
}stbt_t;

int stbnum;
stbt_t stbt[STBNUM_MAX];

void stbtini(){
	if(stbinif==0){
		switch(stagemode){
		case 1:
			break;
		
		case 2:
			break;
		
		case 3:
			stbt[0].Img=LoadGraph("../プロジェクトファイル/resource/graph/stageback/stage3/water.png");
			stbt[0].Imgsi=255;
			stbt[0].Imgx1=0;
			stbt[0].Imgx2=255;
			stbt[0].Imgy1=0;
			stbt[0].Imgy2=255;
			stbt[0].six=100;
			stbt[0].siy=100;
			stbt[0].fromz=1500;
			stbt[0].fadfromz=1000;
			stbt[0].fadtoz=-100;
			stbt[0].toz=-200;
			stbt[0].Type=1;
			stbt[0].sidlo=5;
			stbt[0].zhaba=100;
			stbnum++;

			stbt[1].Img=LoadGraph("../プロジェクトファイル/resource/graph/stageback/stage3/tile.png");
			stbt[1].Imgsi=255;
			stbt[1].Imgx1=0;
			stbt[1].Imgx2=255;
			stbt[1].Imgy1=0;
			stbt[1].Imgy2=255;
			stbt[1].six=100;
			stbt[1].siy=100;
			stbt[1].fromz=1500;
			stbt[1].fadfromz=1000;
			stbt[1].fadtoz=-100;
			stbt[1].toz=-200;
			stbt[1].Type=2;
			stbt[1].sidlo=5;
			stbt[1].zhaba=100;
			stbnum++;

			for(int t=0;t<stbnum;t++){
			float ou1 = (float)stbt[t].Imgx1 / stbt[t].Imgsi, ou2 = (float)(stbt[t].Imgx2 -stbt[t].Imgx1) / stbt[t].Imgsi;
			float ov1 = (float)stbt[t].Imgy1 / stbt[t].Imgsi, ov2 = (float)(stbt[t].Imgy2 -stbt[t].Imgy1) / stbt[t].Imgsi;

			switch(stbt[t].Type){
			case 0:
				break;

			case 1:
				for(int s=0; stbt[t].fromz+stbt[t].zhaba-s*stbt[t].zhaba>stbt[t].toz;s++){
					for(int l=0;l<stbt[t].sidlo;l++){
					stbt[t].stbc[stbt[t].sidlo*s+l].x=stbt[t].six*l;
					stbt[t].stbc[stbt[t].sidlo*s+l].y=0/*stt[i].fromz+stt[i].siy-t*stt[i].siy*/;
					stbt[t].stbc[stbt[t].sidlo*s+l].z=stbt[t].fromz+stbt[t].zhaba-stbt[t].zhaba*s;
					for(int i=0;i<6;i++){
					stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].norm=VGet(0.0f,0.0f,-1.0f);
					stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].u=ou1+ou2*stp[i].u;
					stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].v=ov1+ov2*stp[i].v;
					stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=255;
					stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.r=255;
					stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.b=255;
					stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.g=255;
					}
					}
				}looptest++;
				break;

			case 2:
				for(int s=0;stbt[t].fromz+stbt[t].zhaba-s*stbt[t].zhaba>stbt[t].toz;s++){
					for(int l=0;l<stbt[t].sidlo;l++){
					stbt[t].stbc[stbt[t].sidlo*s+l].x=stbt[t].six*l;
					stbt[t].stbc[stbt[t].sidlo*s+l].y=-10/*stt[i].fromz+stt[i].siy-t*stt[i].siy*/;
					stbt[t].stbc[stbt[t].sidlo*s+l].z=stbt[t].fromz+stbt[t].zhaba-stbt[t].zhaba*s;
					for(int i=0;i<6;i++){
					stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].norm=VGet(0.0f,0.0f,-1.0f);
					stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].u=ou1+ou2*stp[i].u;
					stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].v=ov1+ov2*stp[i].v;
					stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=255;
					stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.r=255;
					stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.b=255;
					stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.g=255;
					}
					}
				}looptest++;
				break;
			}
			}
			break;
		
			case 4:
				break;
			
			case 5:
				break;
			
			case 6:
				break;
			
			case 7:
				break;
			
			case 8:
				break;
			
			default :
				break;
		}
		
		stbinif=1;
	}
}

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

Re: 配列型構造体の数値代入について

#2

投稿記事 by box » 9年前

夢猫。 さんが書きました:stbtという名前の構造体の0番以外の配列に値を代入することができず
そのように判断された根拠を教えてください。
実行時に何かエラーメッセージでも出ましたか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

夢猫。
記事: 28
登録日時: 9年前

Re: 配列型構造体の数値代入について

#3

投稿記事 by 夢猫。 » 9年前

返信が遅れて申し訳ありません。
box さんが書きました: そのように判断された根拠を教えてください。
実行時に何かエラーメッセージでも出ましたか?
すみません。確認してみたところ0番以外に入らないのではなく代入に指定されているうちの最も小さい番号にしか入らないことがわかりました。
試しに
stbt[2].Img=LoadGraph("../プロジェクトファイル/resource/graph/stageback/stage3/water.png");
stbt[2].Imgsi=255;
stbt[2].Imgx1=0;
stbt[2].Imgx2=255;
stbt[2].Imgy1=0;
stbt[2].Imgy2=255;
stbt[2].six=100;
stbt[2].siy=100;
stbt[2].fromz=1500;
stbt[2].fadfromz=1000;
stbt[2].fadtoz=-100;
stbt[2].toz=-200;
stbt[2].Type=1;
stbt[2].sidlo=5;
stbt[2].zhaba=100;
stbnum=2;

stbt[1].Img=LoadGraph("../プロジェクトファイル/resource/graph/stageback/stage3/tile.png");
stbt[1].Imgsi=255;
stbt[1].Imgx1=0;
stbt[1].Imgx2=255;
stbt[1].Imgy1=0;
stbt[1].Imgy2=255;
stbt[1].six=100;
stbt[1].siy=100;
stbt[1].fromz=1500;
stbt[1].fadfromz=1000;
stbt[1].fadtoz=-100;
stbt[1].toz=-200;
stbt[1].Type=2;
stbt[1].sidlo=5;
stbt[1].zhaba=100;
stbnum++;
としてみると1番の方のみのポリゴンが生成され、1番のみに代入されていることがわかりました。
変数の数値の変化をDrawFormatStringによる確認も行いましたがやはり代入されていないと思われる方は何も表示されませんでした。

追記
エラーメッセージはまったく表示されずに動作しました。
その代入以外の動作以外は普通に動きます。代入だけされません。

夢猫。
記事: 28
登録日時: 9年前

Re: 配列型構造体の数値代入について

#4

投稿記事 by 夢猫。 » 9年前

コード:

void stgback(){
	switch(stagemode){
	case 1:
		break;
	case 2:
		break;	
	case 3:
		for(int t=0;t<stbnum;t++){
			for(int s=0;stbt[t].fromz+stbt[t].zhaba-s*stbt[t].zhaba>stbt[t].toz;s++){
				for(int l=0;l<stbt[t].sidlo;l++){
					stbt[t].stbc[stbt[t].sidlo*s+l].z-=20;
					for(int i=0;i<6;i++){
						stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].pos.x=stbt[t].stbc[stbt[t].sidlo*s+l].x+stbt[t].six/2*stp[i].x+50;
						stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].pos.y=stbt[t].stbc[stbt[t].sidlo*s+l].y/*+stwat.siy*stp[i].y*/;
						stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].pos.z=stbt[t].stbc[stbt[t].sidlo*s+l].z+stbt[t].zhaba/2*stp[i].y;
					}
				}
			}
			for(int s=0;stbt[t].fromz+stbt[t].zhaba-s*stbt[t].zhaba>stbt[t].toz;s++){
				for(int l=0;l<stbt[t].sidlo;l++){
					for(int i=0;i<6;i++){
						stbz=stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].pos.z;
						if(stbz<stbt[t].toz){
							stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=0;
						}
						else if(stbt[t].toz<stbz && stbz<=stbt[t].fadtoz){
							stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=(unsigned char)(255.0f/(stbt[t].fadtoz-stbt[t].toz)*(stbz-stbt[t].toz));
						}
						else if(stbt[t].fadtoz<stbz && stbz<=stbt[t].fadfromz){
							stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=255;
						}
						else if(stbt[t].fadfromz<stbz && stbz<=stbt[t].fromz){
							stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=(unsigned char)(255.0f/(stbt[t].fromz-stbt[t].fadfromz)*(stbt[t].fromz-stbz));
						}
						else if(stbz<stbt[t].fromz){
							stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=0;
						}
					}
					if(stbt[t].stbc[stbt[t].sidlo*s+l].z<stbt[t].toz-stbt[t].zhaba*0.5f){
						float sub=(stbt[t].toz-stbt[t].zhaba*0.5f)-stbt[t].stbc[stbt[t].sidlo*s+l].z;
						stbt[t].stbc[stbt[t].sidlo*s+l].z=stbt[t].fromz+stbt[t].zhaba*0.5f-sub;
					}
					if(stbt[t].stbc[stbt[t].sidlo*s+l].z>stbt[t].fromz+stbt[t].zhaba*0.5f){
						float sub=stbt[t].stbc[stbt[t].sidlo*s+l].z-(stbt[t].fromz+stbt[t].zhaba*0.5f);
						stbt[t].stbc[stbt[t].sidlo*s+l].z=stbt[t].toz-stbt[t].zhaba*0.5f+sub;
					}
				}
			}
		}
		break;
	case 4:
		break;
	case 5:
		break;
	case 6:
		break;
	case 7:
		break;
	case 8:
		break;
	}
	SetDrawMode( DX_DRAWMODE_BILINEAR );
	DrawFormatString(400,240,GetColor(1,1,1),"[0] %.d %.d %.d %.d",stbt[1].stbc[0].stbv[0].dif.r,stbt[1].stbc[0].stbv[0].dif.b,stbt[1].stbc[0].stbv[0].dif.g,stbt[1].stbc[0].stbv[0].dif.a);
	DrawFormatString(400,270,GetColor(1,1,1),"[1] %.d %.d %.d %.d",stbt[1].stbc[0].stbv[1].dif.r,stbt[1].stbc[0].stbv[1].dif.b,stbt[1].stbc[0].stbv[1].dif.g,stbt[1].stbc[0].stbv[1].dif.a);
	DrawFormatString(400,300,GetColor(1,1,1),"[2] %.d %.d %.d %.d",stbt[1].stbc[0].stbv[2].dif.r,stbt[1].stbc[0].stbv[2].dif.b,stbt[1].stbc[0].stbv[2].dif.g,stbt[1].stbc[0].stbv[2].dif.a);
	DrawFormatString(400,330,GetColor(1,1,1),"[3] %.d %.d %.d %.d",stbt[1].stbc[0].stbv[3].dif.r,stbt[1].stbc[0].stbv[3].dif.b,stbt[1].stbc[0].stbv[3].dif.g,stbt[1].stbc[0].stbv[3].dif.a);
	DrawFormatString(400,360,GetColor(1,1,1),"[4] %.d %.d %.d %.d",stbt[1].stbc[0].stbv[4].dif.r,stbt[1].stbc[0].stbv[4].dif.b,stbt[1].stbc[0].stbv[4].dif.g,stbt[1].stbc[0].stbv[4].dif.a);
	DrawFormatString(400,390,GetColor(1,1,1),"[5] %.d %.d %.d %.d",stbt[1].stbc[0].stbv[5].dif.r,stbt[1].stbc[0].stbv[5].dif.b,stbt[1].stbc[0].stbv[5].dif.g,stbt[1].stbc[0].stbv[5].dif.a);
	DrawFormatString(400,420,GetColor(1,1,1)," %.d",stbt[2].sidlo);
	for(int t=0;t<stbnum;t++){
	for(int s=0;stbt[t].fromz+stbt[t].zhaba-s*stbt[t].zhaba>stbt[t].toz;s++){
		for(int l=0;l<stbt[t].sidlo;l++){
		DrawPolygon3D(stbt[t].stbc[stbt[t].sidlo*s+l].stbv,2,stbt[t].Img,TRUE);
		}
	}
	}
}
すみません。よくよく考えたら描画部分も上げておかないとだめですね。
ここまでで何か問題があればご指摘いただきたいです。

夢猫。
記事: 28
登録日時: 9年前

Re: 配列型構造体の数値代入について

#5

投稿記事 by 夢猫。 » 9年前

どうやら調べているうちに

コード:

for(int t=0;t<stbnum;t++){
            float ou1 = (float)stbt[t].Imgx1 / stbt[t].Imgsi, ou2 = (float)(stbt[t].Imgx2 -stbt[t].Imgx1) / stbt[t].Imgsi;
            float ov1 = (float)stbt[t].Imgy1 / stbt[t].Imgsi, ov2 = (float)(stbt[t].Imgy2 -stbt[t].Imgy1) / stbt[t].Imgsi;
 
            switch(stbt[t].Type){
            case 0:
                break;
 
            case 1:
                for(int s=0; stbt[t].fromz+stbt[t].zhaba-s*stbt[t].zhaba>stbt[t].toz;s++){
                    for(int l=0;l<stbt[t].sidlo;l++){
                    stbt[t].stbc[stbt[t].sidlo*s+l].x=stbt[t].six*l;
                    stbt[t].stbc[stbt[t].sidlo*s+l].y=0/*stt[i].fromz+stt[i].siy-t*stt[i].siy*/;
                    stbt[t].stbc[stbt[t].sidlo*s+l].z=stbt[t].fromz+stbt[t].zhaba-stbt[t].zhaba*s;
                    for(int i=0;i<6;i++){
                    stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].norm=VGet(0.0f,0.0f,-1.0f);
                    stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].u=ou1+ou2*stp[i].u;
                    stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].v=ov1+ov2*stp[i].v;
                    stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=255;
                    stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.r=255;
                    stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.b=255;
                    stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.g=255;
                    }
                    }
                }looptest++;
                break;
 
            case 2:
                for(int s=0;stbt[t].fromz+stbt[t].zhaba-s*stbt[t].zhaba>stbt[t].toz;s++){
                    for(int l=0;l<stbt[t].sidlo;l++){
                    stbt[t].stbc[stbt[t].sidlo*s+l].x=stbt[t].six*l;
                    stbt[t].stbc[stbt[t].sidlo*s+l].y=-10/*stt[i].fromz+stt[i].siy-t*stt[i].siy*/;
                    stbt[t].stbc[stbt[t].sidlo*s+l].z=stbt[t].fromz+stbt[t].zhaba-stbt[t].zhaba*s;
                    for(int i=0;i<6;i++){
                    stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].norm=VGet(0.0f,0.0f,-1.0f);
                    stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].u=ou1+ou2*stp[i].u;
                    stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].v=ov1+ov2*stp[i].v;
                    stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.a=255;
                    stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.r=255;
                    stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.b=255;
                    stbt[t].stbc[stbt[t].sidlo*s+l].stbv[i].dif.g=255;
                    }
                    }
                }looptest++;
                break;
            }
            }
この部分が原因だと判明しました。
しかし、詳しいことはまだわかっていないのでまた調べて何か分かり次第上げたいと思います。

の開発者

Re: 配列型構造体の数値代入について

#6

投稿記事 by の開発者 » 9年前

意味不明な投稿であったため管理人が削除しました。

夢猫。
記事: 28
登録日時: 9年前

Re: 配列型構造体の数値代入について

#7

投稿記事 by 夢猫。 » 9年前

≫の開発者さん
返信ありがとうございます。参考になりました。
しかし、私の質問からは少しずれてしまっているようです。

夢猫。
記事: 28
登録日時: 9年前

Re: 配列型構造体の数値代入について

#8

投稿記事 by 夢猫。 » 9年前

自己解決しました。
どうやらstbc(ポリゴン生成用の変数)の配列の個数が足りなかっただけのようです。
ご返信くださった皆様、ありがとうございました。
こんな初歩的なことに気づかないとは恥ずかしいです(笑)

閉鎖

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