ページ 11

たびたび質問すみません。。

Posted: 2009年4月01日(水) 18:16
by 狼太郎
四方向にキャラを歩かせるプログラムで
#include "DxLib.h"

typedef struct{
int a,b,c;
} ch_t;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

int image[16];
int muki=3; //A
int flag=0;
char Key[256];
ch_t ch;
ch.a=320;
ch.b=160;

SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image );//画像を分割してimage配列に保存

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
if(ch.a%32==0 && ch.b%32==0){
flag=1;
if(Key[KEY_INPUT_RIGHT]==1)
muki=3;
else if(Key[KEY_INPUT_LEFT]==1)
muki=1;
else if(Key[KEY_INPUT_UP]==1)
muki=0;
else if(Key[KEY_INPUT_DOWN]==1)
muki=2;
else
flag=0;
}

if(flag==1){
switch(muki){
case 3:
ch.a++;
break;
case 1:
ch.a--;
break;
case 0:
ch.b--;
break;
case 2:
ch.b++;
break;
}
}

ch.c=image[(ch.a%32+ch.b%32)/8 + muki*4];
DrawGraph( ch.a , ch.b , ch.c , TRUE ) ;//[12]の画像を描画
ScreenFlip();

}

DxLib_End();
return 0;
}
この
int muki=3;
の部分を
int muki;
にするとアクセス違反が起きるのですが、、、なぜですか?

Re:たびたび質問すみません。。

Posted: 2009年4月01日(水) 18:31
by Mist
規約を守ってソースはpreタグで字下げしてください。

mukiを初期化せずにキーを押していない状態だと最初のif文でmukiが更新されないので不定値のままです。
その結果

ch.c=image[(ch.a%32+ch.b%32)/8 + muki*4];

で、範囲外にアクセスする可能性があります。

Re:たびたび質問すみません。。

Posted: 2009年4月01日(水) 19:38
by 狼太郎
ありがとうございます。
int muki=0;など
初期化しても同じ結果になってしまいます。

Re:たびたび質問すみません。。

Posted: 2009年4月01日(水) 19:42
by Mist
取り合えず字下げしたソースを張ってもらえませんか。
ソースが読みにくくて間違いが見つけにくいです。

ステップ実行した場合にどこまでどの部分で違反が起こるかは調べられていますか?

Re:たびたび質問すみません。。

Posted: 2009年4月02日(木) 19:53
by 狼太郎
すみません・・自己解決できました。。
次からは字下げしときます。。