例外がスローされました:GameがNullPtrでした。を解消するにはどうすればいいですか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

例外がスローされました:GameがNullPtrでした。を解消するにはどうすればいいですか?

#1

投稿記事 by keito94 » 7年前

Stage.cppでCPlayerを初期化しようとすると、GameがNullptrだったという例外がスローされてしまいます。
これを解消するにはどうすればいいのでしょうか?
Stage.h

コード:

#pragma once
class CStage {
public:
	const char* Name;
	CStage(const char* name) : Name(name) {}
	virtual void Init()	{}
	virtual void Destroy() {}
	virtual bool Move() { return true; }
	virtual void Draw() {}
	void DrawStage();
};

class CFirstStage : public CStage {
public:
	CFirstStage() : CStage("FirstStage"){}
	void Init();
	void Destroy();
	bool Move();
	void Draw();
};
Stage.cpp(例外がスローされた部分のみ)

コード:

void CFirstStage::Init() {
	Game->Player = new CPlayer(240.0F, 215.0F); 
}
Scene.h

コード:

#pragma once
#include "Mover.h"
//シーン
class CScene : public CMover {
protected:
	bool FirstLoop;
	int Time, MenuPos;
public:
	CScene()
		:CMover(0, 0),Time(0),MenuPos(0)
	{}
};

class CGameStage : public CScene {
protected:
	bool StageActive;
public:
	CGameStage();
	virtual ~CGameStage();
	bool Move();
	void Draw();
};
extern CGameStage* Scene;
Scene.cpp

コード:

#include "Scene.h"
#include "Main.h"
#include "Stage.h"

CGameStage::CGameStage()
{
}

CGameStage::~CGameStage() {
	Game->Stage[Game->StageIndex]->Destroy();
}

bool CGameStage::Move() {
	bool stage_active = Game->Stage[Game->StageIndex]->Move();
	if (FirstLoop) {
		FirstLoop = false;
	}
	Game->OffSetPlayer();
	return stage_active;
}

void CGameStage::Draw() {
	Game->Stage[Game->StageIndex]->Draw();
}
Main.h

コード:

#pragma once
#include "DxLib.h"
#include <vector>
using namespace std;

class CStage;
class CPlayer;
class CGameStage;
class CGameMain {
	int Time;
public:
	CPlayer* Player;
	vector<CStage*> Stage;
	CGameStage* Scene;
	int PlayerGh[32];
	int MapGraph;
	int StageIndex;
	float Scroll, Vit;
	float ViewX, ViewY;

	CGameMain();
	~CGameMain();
	void ErrMes(LPCSTR str, ...);
	int MapLoad(const char* mapdata,const char* mapchip);
	void Run();
	void OffSetPlayer();
	void MakeStage();
	virtual void Move();
	virtual void Draw();
	void SetStage(int stage);
	void SetPlayer(CPlayer* player) { Player = player; }
	CPlayer* GetPlayer() { return Player; }
};
const float GRAVMAX = 20.0f;
const float GRAV = 0.25F;
const float GOFF = 0.5F;
const int MOTION_MAX = 5;
const int ANIM_MAX = 8;
extern CGameMain *Game;
Main.cpp

コード:

#include "Main.h"
#include "Mapping.h"
#include "Scene.h"
#include "Stage.h"
#include "Player.h"

CFmfMap MapObj;
CGameMain* Game;
CStage* Stage;
FILE* out;
HANDLE Stdout;
int BitCount;

CGameMain::CGameMain() : StageIndex(0){
	//AllocConsole(); out = 0; freopen_s(&out, "CON", "w", stdout); Stdout = GetStdHandle(STD_OUTPUT_HANDLE);
	ChangeWindowMode(TRUE); SetGraphMode(320, 240, 32), SetUseCharSet(DX_CHARSET_UTF8);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);
	LoadDivGraph("自作キャラ.bmp", 32, 8, 4, 16, 16, PlayerGh);
	MapLoad("スクロール.fmf", "マップチップ.bmp");
	MakeStage();
	SetStage(0);
}

void CGameMain::MakeStage() {
	Stage.push_back(new CFirstStage());
}

void CGameMain::SetStage(int stage) {
	StageIndex = stage;
	Stage[StageIndex]->Init();
	Scene = new CGameStage();
}

void CGameMain::Run() {
	//system("cls");
	Player->Move();
	Player->Draw();
	Scene->Move();
	Scene->Draw();
}

int CGameMain::MapLoad(const char* mapdata, const char* mapchip) {
	if (!MapObj.Open(mapdata)) {
		ErrMes("Error Code 30: MapData is Not Loading.");
		return -1;
	}
	BYTE* layer = (BYTE*)MapObj.GetLayerAddr(0);
	if (layer == NULL) {
		ErrMes("Error Code 31: Null Layer.");
		MapObj.Close();
		return -1;
	}
	if ((MapGraph = LoadGraph(mapchip)) == -1) {
		ErrMes("Error Code 41: MapChip is Not Loading.");
		return -1;
	}
	MapGraph = LoadGraph(mapchip);
	BitCount = MapObj.GetLayerBitCount() == 8 ? 16 : 256;
	return 0;
}

void CGameMain::OffSetPlayer() {
	//プレイヤーが居るかどうか確認
	CPlayer* player = GetPlayer();
	if (player == NULL) return;
	Scroll = (player->X - ((20 * 16) / 2));
	int width = MapObj.GetMapWidth();
	Scroll = max(Scroll, 0);
	Scroll = min(Scroll, ((width-20) * MAP_CELL));
	Vit = (player->Y - ((15 * 16) / 2));
	int height = MapObj.GetMapHeight();
	Vit = max(Vit, 0);
	Vit = min(Vit, ((height-15) * MAP_CELL));
	ViewX = player->X - Scroll;
	ViewY = player->Y - Vit;
}

void CGameMain::ErrMes(LPCSTR str, ...) {
	char buf[1024];
	wsprintf(buf, str, (char*)(&str + 1));
	MessageBox(NULL, buf, "Error!!", MB_OK);
}
void CGameMain::Move() {

}

void CGameMain::Draw() {

}

CGameMain::~CGameMain() {
	DxLib_End();
	//fclose(out); FreeConsole();
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPervInstance, LPSTR lpCmdLine, int nCmdShow) {
	Game = new CGameMain;
		while(ScreenFlip()==0&&ProcessMessage()==0&&ClearDrawScreen()==0) {
			Game->Run();
		}
	delete Game;
}
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
purin52002
記事: 235
登録日時: 7年前
連絡を取る:

Re: 例外がスローされました:GameがNullPtrでした。を解消するにはどうすればいいですか?

#2

投稿記事 by purin52002 » 7年前

あまりファイル間での変数のやり取りをしたことがないので頓珍漢なことを言うかもしれませんが、

Stage.cppにGameというポインタはあるのでしょうか?
もしもMain.cppのGameを使いたいのならexternとか何とかを使ったような、、、
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 例外がスローされました:GameがNullPtrでした。を解消するにはどうすればいいですか?

#3

投稿記事 by Dixq (管理人) » 7年前

SceneとPlayerが同レベルに位置しているのが気持ち悪いです。
Sceneが必要な物を所持し、Gameはその画面にあったSceneを持つべきではないでしょうか。
またexternはやめましょう。
C++においてexternを使わないといけない場面はありません。
必要な値はgetメソッドから取得、必要な値のセットはsetメソッドで行うようにしましょう。

梅衣堂ひよ
記事: 24
登録日時: 7年前

Re: 例外がスローされました:GameがNullPtrでした。を解消するにはどうすればいいですか?

#4

投稿記事 by 梅衣堂ひよ » 7年前

keito94 さんが書きました:Stage.cppでCPlayerを初期化しようとすると、GameがNullptrだったという例外がスローされてしまいます。
Gameがnullptrということはそれまでに0やNULL、nullptrを直接的・間接的を問わず代入してしまっている可能性があります。
ここに至るまでの処理を見直すことをお勧めします。
結構説明が下手ですのでご了承ください。割と言葉が足りなかったり文字だらけで分かりにくかったりします。

アバター
沖 滉均
記事: 237
登録日時: 13年前
住所: K県F市

Re: 例外がスローされました:GameがNullPtrでした。を解消するにはどうすればいいですか?

#5

投稿記事 by 沖 滉均 » 7年前

前の投稿でも言われていますが人にデバッグをやってもらうのか
ということです。

デバッグをしているとは何をしているのでしょうか?
デバッグトレーニングとやらをしているというのであれば、Nullptrになっている原因を自分自身で突き止めてみませんか?
デバッグモードで実行するだけではデバッグをしたとは言いませんよ。
あとは再三言われているとおり基礎を勉強して見る気はありませんか?
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: 例外がスローされました:GameがNullPtrでした。を解消するにはどうすればいいですか?

#6

投稿記事 by keito94 » 7年前

皆さんの言うとおり知識不足と、自分でもわけが分からずやっていたのがたたってこんな結果になってしまいました…。
ごめんなさい、C++の基礎を学び直してきます…。
ということで一応解決とさせてください…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

返信

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