いつもお世話になっています。
此処の掲示板の趣旨からすこしずれてしまうのかもしれませんが、
現在、C++言語でシューティングゲームを作っています。そこで思ったのですが、
デバッグをしているときに、インスタンス(実体)のパラメータの数値などの内容を
監視したいのですが、何かそういった機能はvisualstudioにはあるのでしょうか?
具体的には、敵キャラクターのインスタンスのメソッド(キャラクタークラスの抽象メソッド
をオーバーライド)に、敵キャラクターのパラメータx,yが引き継がれているか
を確認したいのです。デバッグの停止中に変数にカーソルを重ねると数値が表示されますが、
この場合、それはできませんでした。
もしあるのでしたらば、教えていただきたいです。
環境はVisualstudio community 2015です
インスタンスのパラメータを監視する方法はありますか?
Re: インスタンスのパラメータを監視する方法はありますか?
お邪魔します。難しいと思います。結局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;
}
/////
Re: インスタンスのパラメータを監視する方法はありますか?
ソースコード上だと、狭い範囲でしか確認できませんがMokutsuno さんが書きました:具体的には、敵キャラクターのインスタンスのメソッド(キャラクタークラスの抽象メソッド
をオーバーライド)に、敵キャラクターのパラメータx,yが引き継がれているか
を確認したいのです。デバッグの停止中に変数にカーソルを重ねると数値が表示されますが、
この場合、それはできませんでした。
ウォッチウィンドウに変数を追加すれば、もっと広い範囲で変数の内容を確認できると思います。
あと、デバッグ出力するなら、わたしは、OutputDebugString関数をお勧めします。
リモートデバッグにも対応しますし、
DebugViewなどを利用すれば特定の出力にフィルタを掛けたり色を変えたりしてあとからでも見付けやすくできます。
Re: インスタンスのパラメータを監視する方法はありますか?
敵キャラクターのオブジェクトはグローバル変数でしょうか?(グローバル変数ならウォッチで見ることができます)
オブジェクトがスコープで見えてないとデバッガで追うのはきついかもしれません。
オブジェクトのポインタをグローバル変数に持たせたりすると、見れると思います。
あと、継承で基本クラスのメンバ変数が見れなくなるということはないみたいです。
添付画像を参照願います。
オブジェクトがスコープで見えてないとデバッガで追うのはきついかもしれません。
void func() {
printf("Hello, World!"); // デバッガがこういうところにいると変数aは見ることができない
}
int main() {
int a = 0;
func();
return 0;
}
あと、継承で基本クラスのメンバ変数が見れなくなるということはないみたいです。
添付画像を参照願います。
- 添付ファイル
-
- 001.png (11.05 KiB) 閲覧数: 2709 回
Re: インスタンスのパラメータを監視する方法はありますか?
皆様ありがとうございます。
グローバル変数にしたりprintfなど使っていこうと思います
ありがとうございました。
グローバル変数にしたりprintfなど使っていこうと思います
ありがとうございました。