ページ 1 / 1
グローバル変数とstaticについて
Posted: 2010年6月10日(木) 23:18
by 胡椒
void game_con(){
static int a=1;
switch(a){
case 1:
if(CheckStateKey(KEY_INPUT_X) == 1 )++con_f;
break;
case 2:
if(CheckStateKey(KEY_INPUT_X) == 1 )con_f++;
break;
case 3:
if(CheckStateKey(KEY_INPUT_Y) == 1)con_f=1;
break;
default:
break;
}
}
というコードにおいて、aの初期値は1です。
ここでXを押すとaの値が一気に3まで増えてしまいます。
aをグローバル変数とし
int a=1;
void game_con(){
switch(a){
case 1:
if(CheckStateKey(KEY_INPUT_X) == 1 )++con_f;
break;
case 2:
if(CheckStateKey(KEY_INPUT_X) == 1 )con_f++;
break;
case 3:
if(CheckStateKey(KEY_INPUT_Y) == 1)con_f=1;
break;
default:
break;
}
}
というコードとすると、一度Xを押すとaの値は2となり、もう一度Xを押すと3となります。
これはどうしてなのでしょうか?
Re:グローバル変数とstaticについて
Posted: 2010年6月10日(木) 23:25
by fatens
提示されたコードからはaの値が変化するとは思えませんが...
Re:グローバル変数とstaticについて
Posted: 2010年6月10日(木) 23:32
by シエル
記載しているコードからはaの値を変化させるようなコードはないと思います。
変化するとしたら、con_fという変数ぐらいだと思います。
この関数外でcon_fをaに代入したり、足してたりするのでしょうか?
Re:グローバル変数とstaticについて
Posted: 2010年6月10日(木) 23:46
by 胡椒
すみませんコードを変えて記載したので、いろいろ間違ってました(汗)
正しくは
void game_con(){
static int a=1;
switch(a){
case 1:
if(CheckStateKey(KEY_INPUT_X) == 1 )a++;
break;
case 2:
if(CheckStateKey(KEY_INPUT_X) == 1 )a++;
break;
case 3:
if(CheckStateKey(KEY_INPUT_Y) == 1)a=1;
break;
default:
break;
}
}
と
int a=1;
void game_con(){
switch(a){
case 1:
if(CheckStateKey(KEY_INPUT_X) == 1 )a++;
break;
case 2:
if(CheckStateKey(KEY_INPUT_X) == 1 )a++;
break;
case 3:
if(CheckStateKey(KEY_INPUT_Y) == 1)a=1;
break;
default:
break;
}
}
でした。
申し訳ないです・・・
Re:グローバル変数とstaticについて
Posted: 2010年6月10日(木) 23:56
by fatens
game_con 関数がどのように呼び出されているのか分かりませんので、
その部分のコードも提示していただけますか。
Re:グローバル変数とstaticについて
Posted: 2010年6月11日(金) 00:09
by シエル
ループしている中でこの関数が呼び出されているとしたら、
キーを押しっぱなしにしている時間が関係してるのではないかと。
Re:グローバル変数とstaticについて
Posted: 2010年6月11日(金) 00:23
by 胡椒
この関数はゲームのコンフィング関係の関数なので、
ゲームタイトルで
http://dixq.net/g/36.html
を参考にして移動制御しmenuの値を決め
int title_flag=1
if(title_flag>0){
if( CheckStateKey(KEY_INPUT_X) == 1 ){
switch(menu)
{
case 0:
break;
case 1:
confing_flag=1;
title_flag=0;
break;
case 2:
break;
case 3:
DxLib_End();
break;
default:
break;
}
}
と置き、menuが1の状態の時にXを押すとconfing_flag=1;となり、それによって
if(confing_flag>0){
game_con();
}
というふうに呼び出してます。
上の関数をさらにmain関数ほうで呼び出しています。
こっちのmain関数はシエルさんがおっしゃる通り、龍神録のようなループの中で呼び出しています。
キーを押す長さは私自身がどんなに素早く押して放しても、結果は変わりませんでした・・・
Re:グローバル変数とstaticについて
Posted: 2010年6月12日(土) 13:28
by hoge
グローバル変数と関数内のstatic変数は、関数の外から見えるかどうかの違いしかありません。
その変数の更新にかんする挙動が変わることはありません。
両者で挙動が違うとしたら、原因は別にあるはずです。
Re:グローバル変数とstaticについて
Posted: 2010年6月12日(土) 14:07
by シエル
すべてのコードを見ないとなんともいえないです。
全コードアップしてくれたら、原因が分かるかもしれないです。
Re:グローバル変数とstaticについて
Posted: 2010年6月12日(土) 20:40
by dic
>case 3:
> if(CheckStateKey(KEY_INPUT_Y) == 1)a=1;
KEY_INPUT_X
KEY_INPUT_X
KEY_INPUT_Y
の順になってますが
タイプミスしてませんか?
3になるのは当然に見えますが