構造体の配列を引数にもつ関数の書き方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
パコネコ
記事: 139
登録日時: 9年前
住所: 大阪

構造体の配列を引数にもつ関数の書き方

#1

投稿記事 by パコネコ » 9年前

今書いてるプログラムでエラーが出てしまい。
2時間ほど悩んで、質問させていただくことにしました。(誰かいるかな?

コード:

typedef struct DATA2{
	int hp,	//状態
		xx,	//x座標
		yy;	//y座標
	int	x,	//中心x座標
		y,	//中心y座標
		z;	//弾の大きさ
	int dd;	//攻撃力
	int ax,	//中心の移動量
		ay,	//中心の移動量
		o,	//xとyの角度
		ao,	//角度の変化値
		as,	//中心からの長さの変化値
		s,	//中心からの長さ
		so,	//中心からの角度
		aso;//中心からの角度の変化値
	int time;//消えるまでの時間(単位:1/60秒)
}TAMA,*TAMA2;

コード:

void tama_liset(TAMA2 tt[50]){
	for(int a=0;a<50;a++){
		tt[a]->hp=0;(<-問題あり
		tt[a]->xx=0;
		tt[a]->yy=0;
		tt[a]->x=0;
		tt[a]->y=0;
		tt[a]->z=0;
		tt[a]->dd=0;
		tt[a]->ax=0;
		tt[a]->ay=0;
		tt[a]->o=0;
		tt[a]->ao=0;
		tt[a]->s=0;
		tt[a]->as=0;
		tt[a]->so=0;
		tt[a]->aso=0;
		tt[a]->time=0;
	}
}


でメインがこれ

コード:

	TAMA t[50];
	tama_liset(&t);

ここの呼び出しにが行けないらしくいろいろ書き換えた結果あきらめました。
どのように書けばいいのでしょうか?
よろしくお願いします。
ニャン!!\(゜ロ\)(/ロ゜)/

アバター
ゆーずぃ
記事: 62
登録日時: 9年前
住所: 埼玉県

Re: 構造体の配列を因数にもつ関数の書き方

#2

投稿記事 by ゆーずぃ » 9年前

期待している型が違うのでは?
TAMA型のtを渡しているのに
tama_lisetの引数ではTAMA2型を求めています。

アバター
パコネコ
記事: 139
登録日時: 9年前
住所: 大阪

Re: 構造体の配列を引数にもつ関数の書き方

#3

投稿記事 by パコネコ » 9年前

そのつもりだったのですが・・・
TAMA型は通常
TAMA2型はポインタ形式
のつもりだったのですが・・・
書き方みすったのでしょうか・・・
ニャン!!\(゜ロ\)(/ロ゜)/

アバター
ゆーずぃ
記事: 62
登録日時: 9年前
住所: 埼玉県

Re: 構造体の配列を引数にもつ関数の書き方

#4

投稿記事 by ゆーずぃ » 9年前

コード:

typedef struct DATA2{
    int hp, //状態
        xx, //x座標
        yy; //y座標
    int x,  //中心x座標
        y,  //中心y座標
        z;  //弾の大きさ
    int dd; //攻撃力
    int ax, //中心の移動量
        ay, //中心の移動量
        o,  //xとyの角度
        ao, //角度の変化値
        as, //中心からの長さの変化値
        s,  //中心からの長さ
        so, //中心からの角度
        aso;//中心からの角度の変化値
    int time;//消えるまでの時間(単位:1/60秒)
}TAMA;
TAMA t;
TAMA *pt = &t; //ここを編集しました

ということではなく?
最後に編集したユーザー ゆーずぃ on 2010年11月28日(日) 04:49 [ 編集 1 回目 ]

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: 構造体の配列を引数にもつ関数の書き方

#5

投稿記事 by ISLe » 9年前

void tama_liset(TAMA tt[50])
#void tama_liset(TAMA tt[])でも同じ

void tama_liset(TAMA2 tt)
で、呼び出すほうは
TAMA t[50];
tama_liset(t);
ですかね。
関数側で実際の要素数は分からないので注意。

アバター
パコネコ
記事: 139
登録日時: 9年前
住所: 大阪

Re: 構造体の配列を引数にもつ関数の書き方

#6

投稿記事 by パコネコ » 9年前

TAMA t;
TAMA *pt = &t;
多分そのようなイメージ。
TAMA2*にアドレスの状態で渡してるので。

(TAMA2 tt)にしたら通りました。
が、別のバグが・・・
ニャン!!\(゜ロ\)(/ロ゜)/

アバター
パコネコ
記事: 139
登録日時: 9年前
住所: 大阪

Re: 構造体の配列を引数にもつ関数の書き方

#7

投稿記事 by パコネコ » 9年前

Run-Time Check Failure #3 - The variable 'pp' is being used without being initialized.
と出て別のプログラム?が出てきてしまいます。
crt0.cが出てきます。

コード:

/*STG弾.h*/
typedef struct DATA2{
	int hp,	//状態
		xx,	//x座標
		yy;	//y座標
	int	x,	//中心x座標
		y,	//中心y座標
		z;	//弾の大きさ
	int dd;	//攻撃力
	int ax,	//中心の移動量
		ay,	//中心の移動量
		o,	//xとyの角度
		ao,	//角度の変化値
		as,	//中心からの長さの変化値
		s,	//中心からの長さ
		so,	//中心からの角度
		aso;//中心からの角度の変化値
	int time;//消えるまでの時間(単位:1/60秒)
}TAMA,*TAMA2;

void tama_liset(TAMA2 tt){
	for(int a=0;a<50;a++){
		(tt+a)->hp=0;
		(tt+a)->xx=0;
		(tt+a)->yy=0;
		(tt+a)->x=0;
		(tt+a)->y=0;
		(tt+a)->z=0;
		(tt+a)->dd=0;
		(tt+a)->ax=0;
		(tt+a)->ay=0;
		(tt+a)->o=0;
		(tt+a)->ao=0;
		(tt+a)->s=0;
		(tt+a)->as=0;
		(tt+a)->so=0;
		(tt+a)->aso=0;
		(tt+a)->time=0;
	}
}

コード:


#include "DxLib.h"
#include "STG弾.h"
int Key[256];
 
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
        else                            GetHitKeyStateAll_InputKey[i]=0;
    }
    return 0;
}
//背景 
void haikei(int yy){
	int z=32;
	//縦線
	for(int x=z;x<640;x+=z)
		DrawLine(x,0,x,480,GetColor(100,100,100));
	//横線
	for(int y=z;y<480;y+=z)
		DrawLine(0,y+yy,640,y+yy,GetColor(100,100,100));
}
//プレイヤーの情報
typedef struct DATA{
	int	x,
		y;
	int ax,
		ay;
}PREI,*PREI2;

//移動用
void idou(PREI2 pp){
	int furagu=4;
	int cont=0xffff;
	
	if(Key[KEY_INPUT_UP]!=0 && Key[KEY_INPUT_UP]<cont){
		cont=Key[KEY_INPUT_UP];
		furagu=0;
	}
	if(Key[KEY_INPUT_DOWN]!=0 && Key[KEY_INPUT_DOWN]<cont){
		cont=Key[KEY_INPUT_DOWN];
		furagu=2;
	}
	if(furagu==0)
		pp->ay=-4;
	else if(furagu==2)
		pp->ay=4;
	else pp->ay=0;

	cont=0xffff;
	if(Key[KEY_INPUT_RIGHT]!=0 && Key[KEY_INPUT_RIGHT]<cont){
		cont=Key[KEY_INPUT_RIGHT];
		furagu=1;
	}
	if(Key[KEY_INPUT_LEFT]!=0 && Key[KEY_INPUT_LEFT]<cont){
		cont=Key[KEY_INPUT_LEFT];
		furagu=3;
	}
	if(furagu==1)
		pp->ax=4;
	else if(furagu==3)
		pp->ax=-4;
	else pp->ax=0;
	//移動させる
	pp->x+=pp->ax;
	pp->y+=pp->ay;
	//行きすぎないように処理
	if(640-32<pp->x)pp->x=640-32;
	if(pp->x<0)pp->x=0;
	if(480-32<pp->y)pp->y=480-32;
	if(pp->y<0)pp->y=0;
}
//描写
void gazou(PREI2 pp,TAMA2 tt){
	DrawBox(pp->x,pp->y,pp->x+32,pp->y+32,GetColor(50,50,200), FALSE) ;   // 四角形を描画;
	for(int a=0;a<50;a++){
		if(0<(tt+a)->hp)DrawCircle((tt+a)->xx,(tt+a)->yy,(tt+a)->z,GetColor(200,200,200),0);
	}
}
//メインになる関数
int state(PREI2 pp){
	int yy=0;
	TAMA t[50];
	tama_liset(t);
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
		//移動
		idou(pp);
		//背景の処理
		if(yy<31)yy++;
		else yy=0; 
		haikei(yy);
		//自分の描写
        gazou(pp,t);
 
        ScreenFlip();
    }
	return 0;
}
//メイン関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
	
	PREI p;
	//自分の初期化
	p.x=640/2;
	p.y=480/2;
	p.ax=0;
	p.ay=0;
	state(&p);
 
    DxLib_End();
    return 0;
}
変更点も含めたすべてのプログラムです。
ニャン!!\(゜ロ\)(/ロ゜)/

アバター
ゆーずぃ
記事: 62
登録日時: 9年前
住所: 埼玉県

Re: 構造体の配列を引数にもつ関数の書き方

#8

投稿記事 by ゆーずぃ » 9年前

>TAMA2*にアドレスの状態で渡してるので。

んー、そこまで詳しくないから何とも言えませんけど、
変数ではなく型として扱われてるからポインタにならないのではないかと。
どのみちポインタとして扱っていたとしても宣言しただけでは空ポインタなので
実体を突っ込む必要があるのでは?

と、言う間に次がw
113のstate(&p)をstate(p)に変えてみて下さい。
間違えました。
全てのhoge(PREI2 pp)をhoge(PREI2 *pp)に変えて下さい。
最後に編集したユーザー ゆーずぃ on 2010年11月28日(日) 05:31 [ 編集 1 回目 ]

アバター
パコネコ
記事: 139
登録日時: 9年前
住所: 大阪

Re: 構造体の配列を引数にもつ関数の書き方

#9

投稿記事 by パコネコ » 9年前

時間を空けてもう一度やってみると起動できたり・・・
&を外すと変換不能と怒られてしまいました・・・
ニャン!!\(゜ロ\)(/ロ゜)/

アバター
パコネコ
記事: 139
登録日時: 9年前
住所: 大阪

Re: 構造体の配列を引数にもつ関数の書き方

#10

投稿記事 by パコネコ » 9年前

(PREI2 pp)などを(PREI2 *pp)にしたところ怒られました。
(PREI *pp)にすると(PREI2 pp)と同じようにうごきました。
(ppだけでなくttも同じように変更しました)
ニャン!!\(゜ロ\)(/ロ゜)/

アバター
ゆーずぃ
記事: 62
登録日時: 9年前
住所: 埼玉県

Re: 構造体の配列を引数にもつ関数の書き方

#11

投稿記事 by ゆーずぃ » 9年前

型自身をポインタにする方法は、ちょっと調べたけど分かりませんでした(;^ω^)
typedefしている時点でTAMA,TAMA2は変数として使われないので・・・
そんなに自信があるわけでなければ普通にTAMA型だけを扱って

コード:

typedef struct {
    int hp, //状態
        xx, //x座標
        yy; //y座標
    int x,  //中心x座標
        y,  //中心y座標
        z;  //弾の大きさ
    int dd; //攻撃力
    int ax, //中心の移動量
        ay, //中心の移動量
        o,  //xとyの角度
        ao, //角度の変化値
        as, //中心からの長さの変化値
        s,  //中心からの長さ
        so, //中心からの角度
        aso;//中心からの角度の変化値
    int time;//消えるまでの時間(単位:1/60秒)
}TAMA;

TAMA t;
TAMA *tp = &t;
として宣言した後、tpだけを用いるやり方の方がいいのではないかと思います。
ちなみにさっきと微妙に変えました。(余計なものを消しました。)
このやり方+hoge(TAMA *pp)でやればエラーは出なくなると思います…。

アバター
ゆーずぃ
記事: 62
登録日時: 9年前
住所: 埼玉県

Re: 構造体の配列を引数にもつ関数の書き方

#12

投稿記事 by ゆーずぃ » 9年前

念の為、PREIも同様です。

コード:

typedef struct{
    int x, y;
    int ax, ay;
}PREI;
PREI pr;
PREI *ppr = &pr;


hoge(PREI *pp);

アバター
パコネコ
記事: 139
登録日時: 9年前
住所: 大阪

Re: 構造体の配列を引数にもつ関数の書き方

#13

投稿記事 by パコネコ » 9年前

ありがとうございました。
一応TAMA2でやってみようと思います。
(参考にしている本にこのやり方があったので
ただ配列バージョンがなかったので、その辺がわからなくて質問させていただいていました。
心配なとこもあるのでゆーずぃさんに教えていただいたやり方も試してみますが。
(エラー自体は今出てないので)
ニャン!!\(゜ロ\)(/ロ゜)/

七篠
記事: 8
登録日時: 9年前

Re: 構造体の配列を引数にもつ関数の書き方

#14

投稿記事 by 七篠 » 9年前

別のところで気になったので。
ファイル名やパスには全角文字(STG弾.h)は使わないほうがエラー防止のためにはいいですよ。

閉鎖

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