インスタンスのパラメータを監視する方法はありますか?

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

インスタンスのパラメータを監視する方法はありますか?

#1

投稿記事 by Mokutsuno » 7年前

いつもお世話になっています。
此処の掲示板の趣旨からすこしずれてしまうのかもしれませんが、
現在、C++言語でシューティングゲームを作っています。そこで思ったのですが、
デバッグをしているときに、インスタンス(実体)のパラメータの数値などの内容を
監視したいのですが、何かそういった機能はvisualstudioにはあるのでしょうか?

具体的には、敵キャラクターのインスタンスのメソッド(キャラクタークラスの抽象メソッド
をオーバーライド)に、敵キャラクターのパラメータx,yが引き継がれているか
を確認したいのです。デバッグの停止中に変数にカーソルを重ねると数値が表示されますが、
この場合、それはできませんでした。

もしあるのでしたらば、教えていただきたいです。
環境はVisualstudio community 2015です

C6b14

Re: インスタンスのパラメータを監視する方法はありますか?

#2

投稿記事 by C6b14 » 7年前

お邪魔します。難しいと思います。結局Debugにはprintfが一番だと思います。C++だとstd::coutも使えます。開発中はWin32であればコンソールを追加します。画像
サンプルです。

コード:

#include <windows.h>
#include <iostream>
#include <stdlib.h>
/////
class System
{
private:
	static LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
public:
	static bool DefRegisterClass();
	static void MessageLoop();
};
/////
class Frame
{
private:
	HWND hwnd;

public:
	Frame();
	~Frame();

public:
	bool Create(int w, int h);
};
/////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	/////////////////////////////////////////////////////////////
	//コンソールを追加します。
	AllocConsole();
	FILE* out = 0; freopen_s(&out, "CON", "w", stdout);
	////


	std::cout << "Start---> ";
	//デフォルトのプロシージャを使って、ウィンドウクラスの登録
	System::DefRegisterClass(); /// 001
	std::cout << "001:";
	//ウィンドウの作成
	Frame frame;
	frame.Create(640, 480);    /// 002
	std::cout << "002:";
	System::MessageLoop();     /// 003


	/// コンソール解放 ///
	fclose(out);FreeConsole();
	return 0;
}
/////////////////////////////////////////////////////////////////
/////
LRESULT CALLBACK System::WinProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
	if (msg == WM_DESTROY)
	{
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, msg, wp, lp);
}
/////
bool System::DefRegisterClass()
{
	std::cout << "Window登録:";
	WNDCLASSEX wc =
	{
		sizeof(WNDCLASSEX),
		CS_HREDRAW | CS_VREDRAW,
		&System::WinProc,
		0, 0,
		GetModuleHandle(0),
		LoadIcon(0, IDI_APPLICATION),
		LoadCursor(0, IDC_ARROW),
		(HBRUSH)GetStockObject(BLACK_BRUSH),
		0,
		TEXT("Form1"),
		0
	};
	if (!RegisterClassEx(&wc))return false;

	return true;
}
/////
void System::MessageLoop()
{
	MSG msg;
	while (GetMessage(&msg, 0, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
}
/////
Frame::Frame()
	: hwnd(0)
{
}
Frame::~Frame(void)
{
}
/////
bool Frame::Create(int w, int h)
{
	hwnd = CreateWindowEx
	(0
		, TEXT("Form1")
		, TEXT("Form1---Game---")
		, WS_OVERLAPPEDWINDOW
		, CW_USEDEFAULT
		, CW_USEDEFAULT
		, w
		, h
		, 0
		, 0
		, GetModuleHandle(0)
		, this
	);
	if (hwnd == 0)return false;

	ShowWindow(hwnd, SW_SHOW);

	return true;
}
/////
違ってたらごめんなさい。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: インスタンスのパラメータを監視する方法はありますか?

#3

投稿記事 by ISLe » 7年前

Mokutsuno さんが書きました:具体的には、敵キャラクターのインスタンスのメソッド(キャラクタークラスの抽象メソッド
をオーバーライド)に、敵キャラクターのパラメータx,yが引き継がれているか
を確認したいのです。デバッグの停止中に変数にカーソルを重ねると数値が表示されますが、
この場合、それはできませんでした。
ソースコード上だと、狭い範囲でしか確認できませんが
ウォッチウィンドウに変数を追加すれば、もっと広い範囲で変数の内容を確認できると思います。

あと、デバッグ出力するなら、わたしは、OutputDebugString関数をお勧めします。
リモートデバッグにも対応しますし、
DebugViewなどを利用すれば特定の出力にフィルタを掛けたり色を変えたりしてあとからでも見付けやすくできます。

あんどーなつ
記事: 171
登録日時: 7年前
連絡を取る:

Re: インスタンスのパラメータを監視する方法はありますか?

#4

投稿記事 by あんどーなつ » 7年前

敵キャラクターのオブジェクトはグローバル変数でしょうか?(グローバル変数ならウォッチで見ることができます)
オブジェクトがスコープで見えてないとデバッガで追うのはきついかもしれません。

コード:

void func() {
  printf("Hello, World!"); // デバッガがこういうところにいると変数aは見ることができない
}
int main() {
  int a = 0;
  func();
  return 0;
}
オブジェクトのポインタをグローバル変数に持たせたりすると、見れると思います。

あと、継承で基本クラスのメンバ変数が見れなくなるということはないみたいです。
添付画像を参照願います。
添付ファイル
001.png
001.png (11.05 KiB) 閲覧数: 2709 回

Mokutsuno
記事: 26
登録日時: 7年前

Re: インスタンスのパラメータを監視する方法はありますか?

#5

投稿記事 by Mokutsuno » 7年前

皆様ありがとうございます。
グローバル変数にしたりprintfなど使っていこうと思います
ありがとうございました。

閉鎖

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