ページ 11

Cで引数に変数のアドレスを渡す時にエラーがでます。

Posted: 2011年9月06日(火) 17:59
by LisetteLander
今まで同一ファイル内でメンバーの関数の内容を書いて、その下にメンバーを扱う関数を記述してました。
その後、これではわかりにくいと思いヘッダーにグローバル関数として記述し、別ファイルでそれぞれ呼び出すことにしました。

その際、直接メモリを弄っていた変数がエラーを吐いたのですが、どう処置したらいいかよくわかりません・・・

↓ヘッダーです

コード:

GLOBAL void unit_angle_left(int,int);
GLOBAL void unit_angle_right(int,int);

GLOBAL void unit_move_left(int,double,int);//
GLOBAL void unit_move_right(int,double,int);//

GLOBAL void unit_angle_change(int,int);

GLOBAL void unit_move_up(int,int);
GLOBAL void unit_move_nup(int,int);

GLOBAL void unit_moveing(double,double,int,double,int);//
GLOBAL void unit_check_move(double,double,int,int);//
GLOBAL void unit_unitpact_angles(int,int);

GLOBAL double unit_range_target(int,int,int,int);//距離測定
GLOBAL double unit_range_player0(int,int);
↓MEMBERです

コード:


void unit_move_left(int i,double *l_x,int k){
	*l_x=unit_status[k].unit_member[i].angle_slide;
}

void unit_move_right(int i,double *l_x,int k){
	*l_x=-unit_status[k].unit_member[i].angle_slide;
}


void unit_moveing(double *l_tmpx,double *l_tmpy,int i,double l_x,int k){//移動先をテンプレートに代入。加速度が微塵もついてなかったらもちろん進行先座標に0を代入
	if(unit_status[k].unit_member[i].speed_inertia>0){
		*l_tmpx = cos(unit_status[k].unit_member[i].angle_inertia + l_x) * (unit_status[k].unit_member[i].speed + unit_status[k].unit_member[i].speed_inertia);//構造体にすべし。(多人数対策)
		*l_tmpy = sin(unit_status[k].unit_member[i].angle_inertia + l_x) * (unit_status[k].unit_member[i].speed + unit_status[k].unit_member[i].speed_inertia);//と思ったけどtmpに入れてるのがすでに構造体なわけでいいんだった
	}else{
		*l_tmpx=0;
		*l_tmpy=0;
	}
}

void unit_check_move(double *l_tmpx,double *l_tmpy,int i,int k){//先に判定して可能なら移動する。l_p_x,yはcharacterの座標のtmp、そこにmove関数から来る数値を足して可能かどうか判断する。
	int result_x = field_check((int)(unit_status[k].unit_member[i].x + *l_tmpx	),(int)(unit_status[k].unit_member[i].y				),k,i);
	int result_y = field_check((int)(unit_status[k].unit_member[i].x			),(int)(unit_status[k].unit_member[i].y + *l_tmpy	),k,i);

	if(1<=result_x){									//x座標、y座標、敵1か味方0か、その番号
		unit_status[k].unit_member[i].x+=*l_tmpx;
	}
	if(1<=result_y){									//x座標、y座標、敵1か味方0か、その番号
		unit_status[k].unit_member[i].y+=*l_tmpy;
	}
	if(2==result_x){//敵にぶつかってたら
		unit_status[k].unit_member[i].life-=0.1;	//ダメージ計算は別にすべき
	}
	if(2==result_y){
		unit_status[k].unit_member[i].life-=0.1;	//ダメージ計算は別にすべき
	}
}
1>unit_ai00.cpp
1>.\unit_ai00.cpp(24) : error C2664: 'unit_move_left' : 2 番目の引数を 'double *' から 'double' に変換できません。(新しい機能 ; ヘルプを参照)
1> この変換が可能なコンテキストはありません。
1>.\unit_ai00.cpp(35) : error C2664: 'unit_move_right' : 2 番目の引数を 'double *' から 'double' に変換できません。(新しい機能 ; ヘルプを参照)
1> この変換が可能なコンテキストはありません。
1>.\unit_ai00.cpp(92) : error C2664: 'unit_moveing' : 1 番目の引数を 'double *' から 'double' に変換できません。(新しい機能 ; ヘルプを参照)
1> この変換が可能なコンテキストはありません。
1>.\unit_ai00.cpp(93) : error C2664: 'unit_check_move' : 1 番目の引数を 'double *' から 'double' に変換できません。(新しい機能 ; ヘルプを参照)
1> この変換が可能なコンテキストはありません。
1>unit_ai.cpp
1>.\unit_ai.cpp(10) : error C2660: 'unit_ai_main00' : 関数に 2 個の引数を指定できません。

Re: Cで引数に変数のアドレスを渡す時にエラーがでます。

Posted: 2011年9月06日(火) 18:02
by softya(ソフト屋)
例えばunit_move_leftですが、プロトタイプ
GLOBAL void unit_move_left(int,double,int);
と関数の実体で
void unit_move_left(int i,double *l_x,int k){
エラーメッセージ通り型が違います。

Re: Cで引数に変数のアドレスを渡す時にエラーがでます。

Posted: 2011年9月06日(火) 18:18
by LisetteLander
ソフト屋さん、返信ありがとうございます。

えーと、つまり
void unit_move_left(int,double*,int);
こういうこと・・・?ではなさそうですね・・

Re: Cで引数に変数のアドレスを渡す時にエラーがでます。

Posted: 2011年9月06日(火) 18:22
by softya(ソフト屋)
sood さんが書きました:void unit_move_left(int,double*,int);
そうです。ポインタ型とポインタのないただの変数は型が違います。
まぁ、実験してみればすぐ確認できます。

Re: Cで引数に変数のアドレスを渡す時にエラーがでます。

Posted: 2011年9月06日(火) 18:39
by LisetteLander
ありがとうございます!無事解決しました!