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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
狼太郎

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

#1

投稿記事 by 狼太郎 » 16年前

四方向にキャラを歩かせるプログラムで
#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;
にするとアクセス違反が起きるのですが、、、なぜですか?

Mist

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

#2

投稿記事 by Mist » 16年前

規約を守ってソースはpreタグで字下げしてください。

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

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

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

狼太郎

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

#3

投稿記事 by 狼太郎 » 16年前

ありがとうございます。
int muki=0;など
初期化しても同じ結果になってしまいます。

Mist

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

#4

投稿記事 by Mist » 16年前

取り合えず字下げしたソースを張ってもらえませんか。
ソースが読みにくくて間違いが見つけにくいです。

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

狼太郎

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

#5

投稿記事 by 狼太郎 » 16年前

すみません・・自己解決できました。。
次からは字下げしときます。。

閉鎖

“C言語何でも質問掲示板” へ戻る