ページ 11

関数ポインタの引数について

Posted: 2009年10月31日(土) 17:28
by ひよこ
関数ポインタの引数についてなんですが、敵の行動パターン制御で龍神録では関数ポインタを使っていて
私もそれを利用しようと改造してみたら、うまくいきません。調べてみるとうまく代入されてないようで、
おそらく関数ポインタの引数が原因ではないかという結論に至りました。
しかし、これだと思うものにしてみたら、コンパイルが通りません。
どうすればいいでしょうか?
extern void enemy_pattern0(enemy_t *enemy);

void (*enemy_pattern[ENEMY_PATTERN_MAX])(enemy_t *enemy) = {
    enemy_pattern0(enemy), 
};
void calc_enemy(){
	enemy_t *p;
	p=head_enemy;
	if(p!=NULL)
		while(p!=NULL){
			if(p->flag==1){
				if(p->pattern<ENEMY_PATTERN_MAX)
					enemy_pattern[p->pattern](p);
			}
			p=p->next;
		}
		
}
//移動パターン0
//下がってきて停滞して上がっていく
void enemy_pattern0(enemy_t *enemy){
    int t=enemy->cnt;
    if(t==0)
        enemy->vy=3;//下がってくる
    if(t==40)
        enemy->vy=0;//止まる
    if(t==enemy->wait)//登録された停滞時間だけして
        enemy->vy=-3;//上がっていく
}

Re:関数ポインタの引数について

Posted: 2009年10月31日(土) 17:32
by box
> しかし、これだと思うものにしてみたら、コンパイルが通りません。
> どうすればいいでしょうか?

まずは、そのときのエラーメッセージを提示しましょう。

Re:関数ポインタの引数について

Posted: 2009年10月31日(土) 18:02
by ひよこ
>d:\マイドキュメント\ダウンロード\dxlib_vc\リスト構造勉強用 シューティング - 2\その3\mydat\source\enemy.cpp(107) : error C2065: 'enemy' : 定義されていない識別子です。

Re:関数ポインタの引数について

Posted: 2009年10月31日(土) 18:29
by box
関数ポインタを使った簡単な例を書いてみました。
参考になるかどうかはわかりません。


#include <stdio.h>

typedef int (*FUNC)(int, int);

int add(int m, int n)
{
    return m + n;
}

int sub(int m, int n)
{
    return m - n;
}

int main(void)
{
    FUNC funcs[/url] = { add, sub };

    printf("%d\n", funcs[0](123, 456));
    printf("%d\n", funcs[1](123, 456));
    return 0;
}

Re:関数ポインタの引数について

Posted: 2009年10月31日(土) 18:41
by ひよこ
ちょっと参考になりづらいです。
自分のソースのどこが悪いのでしょうか?

Re:関数ポインタの引数について

Posted: 2009年10月31日(土) 18:52
by Justy

>自分のソースのどこが悪いのでしょうか

 龍神録のコードと見比べてみました?
(特に enemy_pattern配列のあたり)

Re:関数ポインタの引数について

Posted: 2009年10月31日(土) 19:55
by ひよこ
見比べてみたところ違うところはなく、(int)は型名だと思い型をいれてます。
すみません。ソースを見返していたらenemy->waitの値が40より下だったので、
40以降止まって見えてたのが原因のようです。
boxさん、Justyさんありがとうございました。

Re:関数ポインタの引数について

Posted: 2009年10月31日(土) 19:55
by ひよこ
解決しました。