ページ 1 / 1
構造体の配列を引数にもつ関数の書き方
Posted: 2010年11月28日(日) 04:28
by パコネコ
今書いてるプログラムでエラーが出てしまい。
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);
ここの呼び出しにが行けないらしくいろいろ書き換えた結果あきらめました。
どのように書けばいいのでしょうか?
よろしくお願いします。
Re: 構造体の配列を因数にもつ関数の書き方
Posted: 2010年11月28日(日) 04:36
by ゆーずぃ
期待している型が違うのでは?
TAMA型のtを渡しているのに
tama_lisetの引数ではTAMA2型を求めています。
Re: 構造体の配列を引数にもつ関数の書き方
Posted: 2010年11月28日(日) 04:39
by パコネコ
そのつもりだったのですが・・・
TAMA型は通常
TAMA2型はポインタ形式
のつもりだったのですが・・・
書き方みすったのでしょうか・・・
Re: 構造体の配列を引数にもつ関数の書き方
Posted: 2010年11月28日(日) 04:43
by ゆーずぃ
コード:
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; //ここを編集しました
ということではなく?
Re: 構造体の配列を引数にもつ関数の書き方
Posted: 2010年11月28日(日) 04:44
by ISLe
void tama_liset(TAMA tt[50])
#void tama_liset(TAMA tt[])でも同じ
か
void tama_liset(TAMA2 tt)
で、呼び出すほうは
TAMA t[50];
tama_liset(t);
ですかね。
関数側で実際の要素数は分からないので注意。
Re: 構造体の配列を引数にもつ関数の書き方
Posted: 2010年11月28日(日) 05:04
by パコネコ
TAMA t;
TAMA *pt = &t;
多分そのようなイメージ。
TAMA2*にアドレスの状態で渡してるので。
(TAMA2 tt)にしたら通りました。
が、別のバグが・・・
Re: 構造体の配列を引数にもつ関数の書き方
Posted: 2010年11月28日(日) 05:13
by パコネコ
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;
}
変更点も含めたすべてのプログラムです。
Re: 構造体の配列を引数にもつ関数の書き方
Posted: 2010年11月28日(日) 05:22
by ゆーずぃ
>TAMA2*にアドレスの状態で渡してるので。
んー、そこまで詳しくないから何とも言えませんけど、
変数ではなく型として扱われてるからポインタにならないのではないかと。
どのみちポインタとして扱っていたとしても宣言しただけでは空ポインタなので
実体を突っ込む必要があるのでは?
と、言う間に次がw
113のstate(&p)をstate(p)に変えてみて下さい。
間違えました。
全てのhoge(PREI2 pp)をhoge(PREI2 *pp)に変えて下さい。
Re: 構造体の配列を引数にもつ関数の書き方
Posted: 2010年11月28日(日) 05:30
by パコネコ
時間を空けてもう一度やってみると起動できたり・・・
&を外すと変換不能と怒られてしまいました・・・
Re: 構造体の配列を引数にもつ関数の書き方
Posted: 2010年11月28日(日) 05:40
by パコネコ
(PREI2 pp)などを(PREI2 *pp)にしたところ怒られました。
(PREI *pp)にすると(PREI2 pp)と同じようにうごきました。
(ppだけでなくttも同じように変更しました)
Re: 構造体の配列を引数にもつ関数の書き方
Posted: 2010年11月28日(日) 05:47
by ゆーずぃ
型自身をポインタにする方法は、ちょっと調べたけど分かりませんでした(;^ω^)
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)でやればエラーは出なくなると思います…。
Re: 構造体の配列を引数にもつ関数の書き方
Posted: 2010年11月28日(日) 05:57
by ゆーずぃ
念の為、PREIも同様です。
コード:
typedef struct{
int x, y;
int ax, ay;
}PREI;
PREI pr;
PREI *ppr = ≺
hoge(PREI *pp);
Re: 構造体の配列を引数にもつ関数の書き方
Posted: 2010年11月28日(日) 06:02
by パコネコ
ありがとうございました。
一応TAMA2でやってみようと思います。
(参考にしている本にこのやり方があったので
ただ配列バージョンがなかったので、その辺がわからなくて質問させていただいていました。
心配なとこもあるのでゆーずぃさんに教えていただいたやり方も試してみますが。
(エラー自体は今出てないので)
Re: 構造体の配列を引数にもつ関数の書き方
Posted: 2010年11月28日(日) 08:44
by 七篠
別のところで気になったので。
ファイル名やパスには全角文字(STG弾.h)は使わないほうがエラー防止のためにはいいですよ。