gbdkでのプログラミング中、次のようなコードを書いていたところ、「 Player_init
関数内では player->x
などに50がセットしたつもりなのに、main
関数に戻ると0という値になる」という事象が発生しました。
typedef struct _Player { UBYTE i, x, y; } Player; void Player_init(Player* player, UBYTE i, UBYTE x, UBYTE y) { player->i = i; player->x = x; player->y = y; // spriteの表示は略 } void Player_move(Player* player, UBYTE joystate) { // 略 } int main(void) { Player player; Player_init(&player, 0, 50, 75); for (;;) { Player_move(&player, joypad()); } }
「引数にセットされた値をそのまま構造体のメンバに代入しているのが悪いんじゃないか」と思い、 player->x = x * 1;
とするときちんと main
関数内でも player->x
などの値がセットされたままでした。このためゲーム(?)の制作自体は続けられそうです。
C言語の仕様なのか、コンパイラの仕様なのかも今の自分には分からないため、一度アセンブラのレベルで見ていくべきなのかもしれません。