- 締切済み
C++ 現在書いているプログラムが動きません
VC++ 2010にてプログラムを書きこんでおり、ビルドするとエラー。 おそらく私の無知によるものだとは思うのですが原因が分かりません。 <main.cpp> #include "DxLib.h" #include "ScreenPanel.h" int MapDate[BACKPANEL_XNUM][BACKPANEL_YNUM]; int WeedNum(ScreenPanel* scr_p); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) { if( ChangeWindowMode(TRUE) != 0 )return 0; if( DxLib_Init() != 0 )return 0; if( SetDrawScreen( DX_SCREEN_BACK ) != 0 ){ DxLib_End(); return 0; } ScreenPanel* scr_p; int weednum; for (int i = 0; i < WeedNum(scr_p);i++) { weednum++; } WaitKey() ; DxLib_End() ; return 0 ; } //サブルーチン int WeedNum(ScreenPanel* _scp) { int weednum = _scp -> WeedCounter(); return weednum; } <ScreenPanel.h> #ifndef __SCREENPANEL_H #define __SCREENPANELH const int BACKPANEL_XNUM = 3; const int BACKPANEL_YNUM = 3; const int MapDate[BACKPANEL_XNUM][BACKPANEL_YNUM] { { 1,2,3 }, { 4,5,6 }, { 7,8,9 } }; class ScreenPanel { public: ScreenPanel() {} int WeedCounter() { int result_num = 0; for (int i = 0;i < BACKPANEL_XNUM;i++ ) { for (int j = 0;j < BACKPANEL_YNUM;i++ ) { if (MapDate[i][j] == 1) result_num++; } } return result_num; } }; #endif ご指摘等、あればお願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
まずは、そのエラーメッセージを読むことです。 間違いの場所とその内容は、大体そこに書いてあります。 エラー番号やメッセージで検索すれば、解説が見つかります。 > ScreenPanel* scr_p; 以降、scr_pに何も代入されていません。 ポインタを宣言しただけなので、不正なアドレスを指してる可能性が高いです。 エラーにはなりません。設定しだいでは警告は出ます。 > #ifndef __SCREENPANEL_H > #define __SCREENPANELH これはわざとですか? 今のところはエラーになりませんが、将来エラーの原因になりうるものです。 > const int MapDate[BACKPANEL_XNUM][BACKPANEL_YNUM] { 写し間違いですか? 実際にこうなってますか? 意図したものですか? > int MapDate[BACKPANEL_XNUM][BACKPANEL_YNUM]; 二重宣言になっています。 > #define __SCREENPANELH > int WeedNum(ScreenPanel* _scp) { アンダースコアの扱いには注意が必要です。 http://msdn.microsoft.com/ja-jp/library/cc440188%28v=vs.71%29.aspx の「予約名の形式」を参照のこと
- wormhole
- ベストアンサー率28% (1626/5665)
>VC++ 2010にてプログラムを書きこんでおり、ビルドするとエラー。 エラーが起きるのならエラーメッセージが出力されてるはずですから、それもそのまま書きましょう(これはプログラミング関係で質問する上での基本です)。 とりあえず思い当たるのはMapDataがmain.cppとScreenPanel.hの両方で定義されてますし、型も異なってます。 またグローバル変数の定義をヘッダファイルで行うのは、そのヘッダファイルをインクルードしているソースファイルそれぞれで定義することになるのでお勧めしません。
- Wr5
- ベストアンサー率53% (2173/4061)
どういうエラーなのか。くらいは掲示できませんかね? パッとみた感じでは… >ScreenPanel* scr_p; ScreenPanelクラスへのポインタ変数を用意していますが指している先は不定。 で、 >for (int i = 0; i < WeedNum(scr_p);i++) { どっか判らないアドレスを引数に渡して、アクセス保護違反を誘発させようとしています。 ある意味、RPGの勇者の所行ですな。 勝手に見ず知らずの他人の家に入ってタンスの中のアイテムをゲットしてみたり、王宮の宝物庫に入ってレアアイテムを強奪したり。 WeedNum()のプロトタイプで引数の型がScreenPanel*なので、ScreenPanel*な変数を用意したんですよね? が、引数の型がポインタだからと、どこも指していないポインタを渡すのは間違っています。 ScreenPanel scr; for (int i = 0; i < WeedNum(&scr);i++) { ではありませんか? さらに… >int weednum; こちらも値が不定です。 # ビルド時に警告出ていたかと思いますが…。