FC2ブログ

[SEGA_BOOK]にもつくん(1.2章サンプルコードの解説 page8)

SEGA本こと、以下を読んでる。まだ始まったばかりだけど。

 ゲームプログラマになる前に覚えておきたい技術  平山 尚(株式会社セガ) (著)
  http://www.shuwasystem.co.jp/support/7980html/2118.html

単に知識や解説を並べるような本ではなく、この本に従って進める事で、最後には、
3Dグラフィックゲーム作れると言う。
世の中にいろいろ専門的な本は無数にあるけど、ほぼ間違いなく、最後まで読む前に発散して
全体を理解出来ないまま終わるし。素人にとっては、この本非常に貴重な本だと思う。
4500円もするけど、安過ぎるくらい。

ということで、作業のメモ。

■環境 
 Windows7 Home Premium 64bit SP1
 Visual C++ 2010 Express

■作業メモ
 サポートページから入手したデータ内のサンプルソースを理解しながら、自分で書いて、
 途中で実行して文法確認して見たら、以下エラー。

'NimotsuKun.exe': 'C:\user\work\sega_game_prog\GameLib\src\01_FirstGame\Debug\NimotsuKun.exe' を読み込みました。シンボルが読み込まれました。
'NimotsuKun.exe': 'C:\Windows\SysWOW64\ntdll.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\kernel32.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\KernelBase.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Program Files\AVAST Software\Avast\snxhk.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\apphelp.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\AppPatch\AcLayers.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\sspicli.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\msvcrt.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\rpcrt4.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\cryptbase.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\sechost.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\user32.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\gdi32.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\lpk.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\usp10.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\advapi32.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\shell32.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\shlwapi.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\ole32.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\oleaut32.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\userenv.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\profapi.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\winspool.drv' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\mpr.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\imm32.dll' を読み込みました。Cannot find or open the PDB file
'NimotsuKun.exe': 'C:\Windows\SysWOW64\msctf.dll' を読み込みました。Cannot find or open the PDB file
NimotsuKun.exe の 0x0129273e で初回の例外が発生しました: 0xC0000005: 場所 0xce07cb5d を読み込み中にアクセス違反が発生しました。
NimotsuKun.exe の 0x774d15ee でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xce07cb5d を読み込み中にアクセス違反が発生しました。
プログラム '[5264] NimotsuKun.exe: ネイティブ' はコード -1073741819 (0xc0000005) で終了しました。



問題のソースはこれ。基本、著者サンプル記述を写しているだけだが、initializeを抜かすと、
このエラーが。
#include 
using namespace std;

const char gStageData[] = "\
########\n\
# .. p #\n\
# oo #\n\
# #\n\
# #\n\
########";

const int gStageWidth = 8 ;
const int gStageHeight = 6;

enum Object {
OBJ_SPACE,
OBJ_WALL,
OBJ_GOAL,
OBJ_BLOCK,
OBJ_BLOCK_ON_GOAL,
OBJ_MAN,
OBJ_MAN_ON_GOAL,
OBJ_UNKNOWN,
};

void initialize( Object* state, int w, int h, const char* stageData );
void draw( const Object* state, int w, int h );

int main(){
Object* state = new Object [ gStageWidth * gStageHeight ];

// initialize( state, gStageWidth, gStageHeight, gStageData );

while ( true ){
draw( state, gStageWidth, gStageHeight );
cout << "a:left s:right w:up z:down. command?" << endl;
char input;
cin >> input;
}
}

void initialize( Object* state, int width, int /* height */, const char* stageData ){
const char* d = stageData ;
int x = 0;
int y = 0;
while ( *d != '\0' ) {
Object t ;
switch ( *d ){
case '#': t = OBJ_WALL; break;
case ' ': t = OBJ_SPACE; break;
case 'o': t = OBJ_BLOCK; break;
case 'O': t = OBJ_BLOCK_ON_GOAL; break;
case '.': t = OBJ_GOAL; break;
case 'p': t = OBJ_MAN; break;
case 'P': t = OBJ_MAN_ON_GOAL; break;
case '\n': x = 0; ++y; t = OBJ_UNKNOWN; break;
default: t = OBJ_UNKNOWN; break;
}
++d;
if ( t != OBJ_UNKNOWN ) {
state[ y*width + x ] = t;
++x;
}
}
}

void draw( const Object* state, int width, int height ){
const char font[] = {' ', '#', '.', 'o', 'O', 'p', 'P'};
for ( int y = 0; y < height; ++y ){
for ( int x=0; x < width; ++x){
Object o = state[ y*width + x];
//------------------------------------
if ( x == 0) {
while ( true ){}
}
//------------------------------------
cout << font[ o ];
}
cout << endl;
}
}


試しに以下記述を上のソースに埋め込むと、正常実行された。
よって、「Object o = state[ y*width + x];」までは実行される。
//------------------------------------
if ( x == 0) {
while ( true ){}
}
//------------------------------------

さらに、if条件をx==1にすると、エラー発生。
また、このデバッグ記述を「cout << font[ o ];」の後ろに持って来てもエラー。
よって、for文最初の「cout << font[ o ];」を実行した時にエラーになる。
原因は、stateの各要素をinitializeで初期化しなかったため、
「Object o = state[ y*width + x];」とすると、oの中に、0~6以外の数字
が入ってしまったと理解。fontは、
const char font[] = {' ', '#', '.', 'o', 'O', 'p', 'P'};
7つの配列(index=0~6)であり、順番に0から連番になるとの事。
よって、0~6以外の数字、しかも、アクセスしてはいけないアドレスになっていたため、
上記エラーの通り、OSから怒られたと理解。
試しに、oではなく、
cout << font[ 0 ];
    :
cout << font[ 7 ];
と0から順番に数字を入れると、7の時に以下エラーが出る。0-6がOKなのは想定通り。
Run-Time Check Failure #3 - The variable 'font' is being used without being initialized.


■C++メモ
 ○列挙型
  ・例えば、以下Objectの型で変数を作ると、その変数には、以下で宣言したOBJ_SPACEなどの
   値しか代入出来なくなる。それ以外の値はコンパイルエラーになるため入る値を保証出来る。

enum Object {
OBJ_SPACE,
OBJ_WALL,
OBJ_GOAL,
OBJ_BLOCK,
OBJ_BLOCK_ON_GOAL,
OBJ_MAN,
OBJ_MAN_ON_GOAL,
};


余談だが、OBJ_SPACEとか半角空白入れてインデントしてるのになぜ、表示されない?
全角空白だと表示される。でも全角空白じゃコピーしてそのまま使えないしイヤだな。

他の人のHPソース見て調べたら、とりあえず、"<"pre>~"<"/pre>で囲めば(実際には"を削除。
構文として扱われてしまうので暫定処置)、半角空白消されないみたい。
上のenum宣言は、それで書いたもの。半角空白を消されず、インデントされて表示されてる。
スポンサーサイト
カレンダー
08 | 2018/09 | 10
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

Author:bobgosso
FPGAのブログへようこそ!

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード