classにおけるprivate変数に関して

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
史上最悪のデスペナ
記事: 521
登録日時: 13年前

classにおけるprivate変数に関して

#1

投稿記事 by 史上最悪のデスペナ » 12年前

VC++&DXライブラリ使用です

以下のようなコードでは変数「count」がちゃんと1ループごとに増えていきます。
(class内の関数であれば値が保持されることを確認するためにDraw関数にもcountの値を表示させています)

コード:


//main.cpp

#include "DxLib.h"
#include "test.h"

C_Test Test;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

	{
		ChangeWindowMode(TRUE);
		if(DxLib_Init() == -1) return -1;
		if(SetDrawScreen(DX_SCREEN_BACK) != 0) return -1;

	}


	//メインループ(ESCで終了)
    while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
	{

		//画面の初期化
		ClearDrawScreen();

		Test.Count();
		Test.Draw();

		//フリップ
        ScreenFlip();
    }

    DxLib_End();

    return 0;
}

コード:


//test.cpp

#include "test.h"

void C_Test::Count()
{
	count++;
	DrawFormatString(0,0,GetColor(255,0,0),"%d",count);
}

void C_Test::Draw()
{
	DrawFormatString(0,20,GetColor(255,0,0),"%d",count);
}

コード:


//test.h

#include "DxLib.h"

class C_Test
{

	int count;
    int OpacityRate;

public:

	void Count(void);
	void Draw(void);
};
コードが少し長くなるので下に移ります。
最後に編集したユーザー 史上最悪のデスペナ on 2011年11月28日(月) 10:49 [ 編集 1 回目 ]

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#2

投稿記事 by 史上最悪のデスペナ » 12年前

しかし、自作ゲームにおいて以下のようなプログラムでは変数「OpacityRate」が0.01fづつ増えません
やりたいことは
「DeathFlag」が0なら普通に敵を描画
         1なら敵モデルを徐々に透明に、ラグドール(死体のモデル)を徐々に不透明にする(OpacityRateが1.0になったら敵モデル破棄してDeathFlagを2にする)
         2ならラグドールを徐々に透明にする
OpacityRateを敵モデルの保持する構造体の中に入れてa->OpacityRateで処理すればちゃんと動きます
どこがいけないのでしょうか?

コード:


	switch( a->DeathFlag )
	{
		case 0:

			MV1DrawModel( a->ModelHandle );

			break;
		case 1:

			OpacityRate += 0.01f;
			if(OpacityRate >= 1.0f)
			{
				MV1DeleteModel( a->ModelHandle );
				MV1DeleteModel( a->ColiCheckHandle );
				OpacityRate = 1.0f;
				a->DeathFlag = 2;
			}
			MV1SetOpacityRate( a->ModelHandle, 1 - OpacityRate );
			MV1DrawModel( a->ModelHandle );

			MV1SetOpacityRate( a->DeathHandle, OpacityRate );
			MV1DrawModel( a->DeathHandle );

			break;
		case 2:

			OpacityRate -= 0.01f;
			if(OpacityRate <= 0.0f)
			{
				MV1DeleteModel( a->DeathHandle );
				OpacityRate = 0.0f;
				a->DeathFlag = 0;
			}
			MV1SetOpacityRate( a->DeathHandle, OpacityRate );
			MV1DrawModel( a->DeathHandle );

			break;
	}


アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: classにおけるprivate変数に関して

#3

投稿記事 by bitter_fox » 12年前

史上最悪のデスペナ さんが書きました:しかし、自作ゲームにおいて以下のようなプログラムでは変数「OpacityRate」が0.01fづつ増えません
やりたいことは
「DeathFlag」が0なら普通に敵を描画
         1なら敵モデルを徐々に透明に、ラグドール(死体のモデル)を徐々に不透明にする(OpacityRateが1.0になったら敵モデル破棄してDeathFlagを2にする)
         2ならラグドールを徐々に透明にする
OpacityRateを敵モデルの保持する構造体の中に入れてa->OpacityRateで処理すればちゃんと動きます
どこがいけないのでしょうか?
case 0, 1, 2においてDeathFlagとOpacityRateをプリントデバッグ等で確認するとどのようになりますか?

「OpacityRateを敵モデルの保持する構造体の中に入れてa->OpacityRateで処理すればちゃんと動きます」
とありますが、このシチュエーションにおいてOpacityRateというのはどのような変数なのでしょうか?
関数内変数?クラス内変数?また、それらにおいてどのような修飾がされているのでしょうか?

OpacityRateが関数内変数でもってstatic修飾されていないと二度目以降の呼び出しで値が保持されませんよ。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: classにおけるprivate変数に関して

#4

投稿記事 by softya(ソフト屋) » 12年前

これだけのコードだと何とも言えませんね。変数の定義、インスタンスの生成、呼び出し部分も見てみないことには。

ちなみに、この方法を使って狙った動作をしているか確認できますよ。お試し下さい。
「簡単RPG講座 番外編。 デバッグ入門 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&b=982
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#5

投稿記事 by 史上最悪のデスペナ » 12年前

プリントデバッグなるものが分かりませんがゲーム画面上に値を表示すると
HPが0より大きい時は
OpacityRate = 0.0f
DeathFlag = 0
ですが0以下になると
OpacityRate = 0.01f
DeathFlag = 1

のまま変化しません
bitter_fox さんが書きました:このシチュエーションにおいてOpacityRateというのはどのような変数なのでしょうか?
関数内変数?クラス内変数?また、それらにおいてどのような修飾がされているのでしょうか?
あ、ごめんなさい。ここでの表記忘れです。
正しくは

コード:


//test.h
 
#include "DxLib.h"
 
class C_Test
{
 
    int count;
    int OpacityRate;

public:
 
    void Count(void);
    void Draw(void);
};
です

修飾なるものが分かりません。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#6

投稿記事 by 史上最悪のデスペナ » 12年前

softya(ソフト屋) さんが書きました:ちなみに、この方法を使って狙った動作をしているか確認できますよ。お試し下さい。
「簡単RPG講座 番外編。 デバッグ入門 • C言語交流フォーラム ~ mixC++ ~」
blog.php?u=114&b=982
一応、似たような(?)方法として
ゲーム画面上に自分が今追跡しようとしてる変数を表示したり無理やりキーで値を変更するようにしてifやswitch内を通るかVC++のブレークポイントとかいうのを作成してやっていますがどうでしょう?


softya(ソフト屋) さんが書きました:これだけのコードだと何とも言えませんね。変数の定義、インスタンスの生成、呼び出し部分も見てみないことには。
現在編集中

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: classにおけるprivate変数に関して

#7

投稿記事 by softya(ソフト屋) » 12年前

史上最悪のデスペナ さんが書きました:
softya(ソフト屋) さんが書きました:ちなみに、この方法を使って狙った動作をしているか確認できますよ。お試し下さい。
「簡単RPG講座 番外編。 デバッグ入門 • C言語交流フォーラム ~ mixC++ ~」
blog.php?u=114&b=982
一応、似たような(?)方法として
ゲーム画面上に自分が今追跡しようとしてる変数を表示したり無理やりキーで値を変更するようにしてifやswitch内を通るかVC++のブレークポイントとかいうのを作成してやっていますがどうでしょう?
画面表示と違い連続した変化を見れるのでコンソール画面を推奨します。まぁ無理に使わなくて良いんですけどね。
あと、ブレークポイントは流れが止まるので使い方次第です。

とりあえず、OpacityRate の値を変化させている部分全部にprintを埋め込んで調べてみてください。どこの部分か区別が付くように表示の仕方は分けてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: classにおけるprivate変数に関して

#8

投稿記事 by bitter_fox » 12年前

史上最悪のデスペナ さんが書きました:プリントデバッグなるものが分かりませんがゲーム画面上に表示すると
HPが0より大きい時は
OpacityRate = 0.0f
DeathFlag = 0
ですが0以下になると
OpacityRate = 0.01f
DeathFlag = 1

のまま変化しません
デバッグプリントが正しかったですかね。
デバッグプリント・printfデバッグというのは値を画面等に出力してそれが正常な値かどうかを確認してデバッグするという手法のことを言います。

どこか別のところでOpacityRateが常に0になるような操作を行ってるのではないかと思います。
史上最悪のデスペナ さんが書きました: あ、ごめんなさい。ここでの表記忘れです。
正しくは

コード:


//test.h
 
#include "DxLib.h"
 
class C_Test
{
 
    int count;
    int OpacityRate;

public:
 
    void Count(void);
    void Draw(void);
};
です

修飾なるものが分かりません。
なるほど、これだったら常に値は保持されてるはずですね。

修飾というのはprivateやstaticと言った変数等の性質を決定することです。
C++だとprivateとかはアクセス指定とかって言うのかな?

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#9

投稿記事 by 史上最悪のデスペナ » 12年前

bitter_fox さんが書きました:修飾というのはprivateやstaticと言った変数等の性質を決定することです。
C++だとprivateとかはアクセス指定とかって言うのかな?
用語をまともに知らないのです^^;
とりあえずコードを見てまねて無理やりゴリゴリ動かすという手法の独学でしたから・・・・・

OpacityRateの値に関してですが、プロジェクト内の全てのファイルを走査しましたがここに貼り付けたコード以外の部分にはなかったので
多分常に0にするようなとこはないんじゃないかと思います。
最後に編集したユーザー 史上最悪のデスペナ on 2011年11月28日(月) 11:25 [ 編集 1 回目 ]

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#10

投稿記事 by 史上最悪のデスペナ » 12年前

史上最悪のデスペナ さんが書きました:OpacityRateの値に関してですが、プロジェクト内の全てのファイルを走査しましたがここに貼り付けたコード以外の部分にはなかったので
多分常に0にするようなとこはないんじゃないかと思います。
(switch前 - case 1:内のbreak前 - switch後)という形でOpacityRateの値をコンソール出力したところ
(0.00000 - 0.01000 - 0.01000)の繰り返しになったのでどうやらどこかで常に0にされてるようです。引き続き追跡します

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: classにおけるprivate変数に関して

#11

投稿記事 by bitter_fox » 12年前

史上最悪のデスペナ さんが書きました:
史上最悪のデスペナ さんが書きました:OpacityRateの値に関してですが、プロジェクト内の全てのファイルを走査しましたがここに貼り付けたコード以外の部分にはなかったので
多分常に0にするようなとこはないんじゃないかと思います。
(switch前 - case 1:内のbreak前 - switch後)という形でOpacityRateの値をコンソール出力したところ
(0.00000 - 0.01000 - 0.01000)の繰り返しになったのでどうやらどこかで常に0にされてるようです。引き続き追跡します
とするとC_Testのインスタンスが毎回作成されているという可能性はありませんか?
C_Testのコンストラクタでデバッグプリントをしてみてください。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#12

投稿記事 by 史上最悪のデスペナ » 12年前

bitter_fox さんが書きました:C_Testのインスタンスが毎回作成されているという可能性はありませんか?
C_Testのコンストラクタでデバッグプリントをしてみてください。
count++;はちゃんと一個ずつ足されていくのでインスタンス毎回作成はないと思ったのですが・・・・・・
ちなみに、クラス内の関数全てにprintfして追跡しても見つかりませんでした・・・・・・


コンストラクタでデバッグプリントを考え中

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: classにおけるprivate変数に関して

#13

投稿記事 by beatle » 12年前

僕はデスペナさんが示されたC_Testクラスの中のOpacityRateがint型なのが非常に気になるのですが。
int型変数に0.01fを加算しても意味ありませんよ。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: classにおけるprivate変数に関して

#14

投稿記事 by softya(ソフト屋) » 12年前

あとインスタンスのコピーとか、常に同じインスタンスなのかも心配。

コード:

printf( "this=%p\n", this );
これも加えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#15

投稿記事 by 史上最悪のデスペナ » 12年前

beatle さんが書きました:int型変数に0.01fを加算しても意味ありませんよ。
ごめんなさい。これも間違いです^^;

コード:

float OpacityRate;
です。

ちなみに、実はC_Testと例のswitch文とは何の関係もないのです^^;勘違いさせるような書き方して申し訳ありません。直すのも面倒なのでC_Test内に(これ上で)書きこんでるのでミスがあることも・・・・・

実際には例のswitch文はclassの一つであるC_MOB内の関数の一部で、float OpacityRate;もC_MOBに宣言されてます。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: classにおけるprivate変数に関して

#16

投稿記事 by beatle » 12年前

全体のソースをお示しになられると混乱もなくなり、みなさんハッピーかと思います。
長いならspoilタグで囲むか、zipして添付ですかね。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#17

投稿記事 by 史上最悪のデスペナ » 12年前

beatle さんが書きました:全体のソースをお示しになられると混乱もなくなり、みなさんハッピーかと思います。
長いならspoilタグで囲むか、zipして添付ですかね。
それはzip添付は考えたのですが3DRPGを作ろうとしてるのでコードが(自分にとって)かなり多いうえ、コメントとかほとんど書き込んでませんし、
特に、softya(ソフト屋)さんにこちらのトピックNo5で
ご指摘いただいたのがまだ全部直せてないので申し訳ないというのもありますので・・・・・・

thisの値ですが全て009469C8という値でしたので同じインスタンスという解釈でいいですよね?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: classにおけるprivate変数に関して

#18

投稿記事 by softya(ソフト屋) » 12年前

史上最悪のデスペナ さんが書きました: thisの値ですが全て009469C8という値でしたので同じインスタンスという解釈でいいですよね?
たぶん大丈夫です。
コンパクトな再現コードは作れませんか?
本物として分離して実験したほうがよさそうです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#19

投稿記事 by 史上最悪のデスペナ » 12年前

とりあえずzipを添付しようとしたらなぜか出来ないようです・・・・・・・

コンパクトな再現コードは多分可能だと思いますので明日こちらに投稿させていただきます。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#20

投稿記事 by 史上最悪のデスペナ » 12年前

おはようございます
やはりzip添付が出来ません
spoilだとバイナリデータを表すのは無理ですし・・・・・
どうしましょう?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: classにおけるprivate変数に関して

#21

投稿記事 by softya(ソフト屋) » 12年前

ファイル添付できますよ。
試しにやってみました。
添付ファイル
test.zip
(122 バイト) ダウンロード数: 105 回
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#22

投稿記事 by 史上最悪のデスペナ » 12年前

あれ~?なんででしょう?普通にファイル添付タブをクリックしてファイル選択してファイル追加するだけですよね?
ファイル追加するとChromeでは下のほうに何%済みみたいなのが出るのですが
それが100%になったとたん画面が更新されて
本文に打ち込んだのが全部消えた上、何処探しても正常にアップロードされました、とか添付ファイル名が現れたりとか
アップロードされたことが分かるような状況がないのですが・・・・・・

追記
2時間ほどインできませんのでまた後ほどよろしくお願いします

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: classにおけるprivate変数に関して

#23

投稿記事 by softya(ソフト屋) » 12年前

とりあえず私はfirefoxです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#24

投稿記事 by 史上最悪のデスペナ » 12年前

なんででしょう?
古いPC(XPでWiMAX使用&Chrome)でも、新しいPC(7でstarcat&Chrome)でも、学校のPC(Vistaで回線不明&IE)でも出来ないのですが・・・・・
前は出来たのに。前の分を削除すればいいのですかね・・・・・?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: classにおけるprivate変数に関して

#25

投稿記事 by softya(ソフト屋) » 12年前

ファイル名が禁止キーワードに引っかかってないですか?
英字にしてみる&名前を変えてみる
を試してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: classにおけるprivate変数に関して

#26

投稿記事 by bitter_fox » 12年前

史上最悪のデスペナ さんが書きました:なんででしょう?
古いPC(XPでWiMAX使用&Chrome)でも、新しいPC(7でstarcat&Chrome)でも、学校のPC(Vistaで回線不明&IE)でも出来ないのですが・・・・・
前は出来たのに。前の分を削除すればいいのですかね・・・・・?
外部のアップローダ等を使用するのも一つの手ですね。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: classにおけるprivate変数に関して

#27

投稿記事 by beatle » 12年前

僕は普段firestorageってところを使っています。参考にどうぞ。

追記:ファイル名の1文字目が全角文字だとダメかもしれません。http://support.hiikun.net/bbs/topic-559.html

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#28

投稿記事 by 史上最悪のデスペナ » 12年前

VerEditing.zipに名前を変更してもダメでした・・・・・・orz

外部アップローダを使用します
こちらからよろしくお願いします。

ちなみにVerFullも一応Upしておきます→こちら
最後に編集したユーザー 史上最悪のデスペナ on 2011年11月29日(火) 11:29 [ 編集 1 回目 ]

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: classにおけるprivate変数に関して

#29

投稿記事 by beatle » 12年前

50MB超えてますね。大きすぎるのが失敗要因じゃないでしょうか。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#30

投稿記事 by 史上最悪のデスペナ » 12年前

なるほど。確かに前は47Mでしたし・・・・・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: classにおけるprivate変数に関して

#31

投稿記事 by softya(ソフト屋) » 12年前

VC++のプロジェクトは公開するには余分なものを含んでいるのでzipから削除して下さいね。
xxx.ncbとかxxxx.ipchとかxxxx.sdfとかです。消しても自動的に復元されます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#32

投稿記事 by 史上最悪のデスペナ » 12年前

softya(ソフト屋) さんが書きました:VC++のプロジェクトは公開するには余分なものを含んでいるのでzipから削除して下さいね。
xxx.ncbとかxxxx.ipchとかxxxx.sdfとかです。消しても自動的に復元されます。
なるほど。知らなかったです。以後気をつけます

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: classにおけるprivate変数に関して

#33

投稿記事 by softya(ソフト屋) » 12年前

これ、どんな操作をすると再現するんでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#34

投稿記事 by 史上最悪のデスペナ » 12年前

あ、そうでした。ファイル添付に失敗した時に書いたのでそれが消えちゃったんでした。すみません^^;

「W」をしばらく押すとDeathFlagが1になるようにしました。
コンソールは
インスタンスの識別コードみたいなやつ--switch前のOpacityRateの値--cae 1:のbreak前の(ry--関数終了前の(ry
という風に表示しています

Full.verでは左クリックで袈裟切りモーションが発動します。剣と敵に当たり判定を行い、当たっていれば徐々にHPが減っていくはずです。
また、Full.verではOpacityRateを構造体内に入れているので、起こしたい現象がちゃんと起きています

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: classにおけるprivate変数に関して

#35

投稿記事 by softya(ソフト屋) » 12年前

メモリ破壊の様です。
次のようにしてデバッグしてみてください。

1.C_MOBのコンストラクタにブレークポイントを貼る。
2.デバッグ開始
3.OpacityRateを選択した上で、デバック→ブレークポイントの作成→新しいデータブレークポイント
4.アドレス&OpacityRate バイト数4としてOK。こうすると変数が書き変えられるとブレークします。
5. F5で再開。wを押す。一度ブレークするが更にF5。予想外の関数でブレークします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#36

投稿記事 by 史上最悪のデスペナ » 12年前

何故メモリ破壊が起きたのでしょう・・・・・・
今日はもうインできませんが、教えていただいた方法でデバッグしてみます。

申し訳ありませんが、また明日もお付き合いください。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: classにおけるprivate変数に関して

#37

投稿記事 by softya(ソフト屋) » 12年前

史上最悪のデスペナ さんが書きました:何故メモリ破壊が起きたのでしょう・・・・・・
今日はもうインできませんが、教えていただいた方法でデバッグしてみます。

申し訳ありませんが、また明日もお付き合いください。
ヒント:メモリ破壊の原因は配列の添字かポインタの操作ミスです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ふりかけ

Re: classにおけるprivate変数に関して

#38

投稿記事 by ふりかけ » 12年前

OpacityRate が float型なのは理由があるのですか?
誤差がでたりするので、物理演算ならともかく ゲーム的な処理では int型でできるだけ済ませるのが好きです。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#39

投稿記事 by 史上最悪のデスペナ » 12年前

ふりかけ さんが書きました:OpacityRate が float型なのは理由があるのですか?
ただ単にDXLibの仕様が
int MV1SetOpacityRate( int MHandle, float Rate ) ;
のようにfloat(0.0f~1.0f)だからです。
softya(ソフト屋) さんが書きました:ヒント:メモリ破壊の原因は配列の添字かポインタの操作ミスです。
当たり判定での配列の添字が1つ足りなかったからでした。
OpacityRateを使ってるところだけを見てても分からないはずです^^;


お騒がせしました。皆さん、ありがとうございました

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: classにおけるprivate変数に関して

#40

投稿記事 by softya(ソフト屋) » 12年前

史上最悪のデスペナ さんが書きました:当たり判定での配列の添字が1つ足りなかったからでした。
OpacityRateを使ってるところだけを見てても分からないはずです^^;
プロでもその手のバグが一番多いのです。
配列を使う時は出来るだけenumなど自動的に最大値を定義できるものはしたほうが良いです。
今回の場合
enum {Ground, Build, enemy};
があるので
enum {Ground, Build, enemy, MAP_HIT_MAX};
としておいて
MV1_COLL_RESULT_POLY MapHit[MAP_HIT_MAX]; //Map当たり判定
とすれば防げたでしょう。

あとミスをすること想定して
assert(Flag<MAP_HIT_MAX);
assert(Flag>=0);
も書いておくと完璧です。

解決マークをお願いしますね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: classにおけるprivate変数に関して

#41

投稿記事 by 史上最悪のデスペナ » 12年前

softya(ソフト屋) さんが書きました:プロでもその手のバグが一番多いのです。
そうなんですか。
softya(ソフト屋) さんが書きました:enum {Ground, Build, enemy};
があるので
enum {Ground, Build, enemy, MAP_HIT_MAX};
としておいて
MV1_COLL_RESULT_POLY MapHit[MAP_HIT_MAX]; //Map当たり判定
とすれば防げたでしょう。
そういうテクニックって独学だと思いつきませんよね。なかなか。頭のいい人は思いつくんだろうけど・・・・
softya(ソフト屋) さんが書きました:あとミスをすること想定して
assert(Flag<MAP_HIT_MAX);
assert(Flag>=0);
も書いておくと完璧です。
これが何か分からないのでちょっと調べてみます
softya(ソフト屋) さんが書きました:解決マークをお願いしますね。
忘れてました^^;

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: classにおけるprivate変数に関して

#42

投稿記事 by softya(ソフト屋) » 12年前

史上最悪のデスペナ さんが書きました: そういうテクニックって独学だと思いつきませんよね。なかなか。頭のいい人は思いつくんだろうけど・・・・
私も誰かの受け売りです。
そういうのを勉強するのはコードリーディングですね。つまり、人のプログラムを読むんです。
私のRPG講座のソースコード最終版とかも参考になるかも知れません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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