分割コンパイルについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
奥兵

分割コンパイルについて

#1

投稿記事 by 奥兵 » 13年前

Direct2Dで画像を表示するサンプルソースを参考にゲーム向けにを改造しています。
ゲーム本体の処理とデバイス系のソースを分割し、ゲーム側のソースで画像の変数を宣言したいので
ゲーム側のソースで変数を宣言してポインタを渡すようにしてみましたがうまくいきません。
ブレークポイントを使ってデバイス側で確認すると、読み込み用の関数内ではしっかり読み込んでいますが
描画側の関数に渡した変数は空になっています。
どなたかアドバイスお願いします。
VC++2010,DirectXは10です。

↓ゲームのメイン部にする部分です ソースはゲーム側

コード:

int DemoApp::GameMain(){

		
	static ID2D1Bitmap *testBit;//画像のポインタ

	static int mode = INITIAL;

	switch(mode){
	case INITIAL:
	
		LoadGr(L"img/uni001.png",testBit);//画像名とポインタを渡しています
		mode=MAIN;

	break;
	case MAIN:
		
		wait();
		GetKey(); 
		paint(testBit);

	break;

	}
	return 0;
}
↓画像の読み込み部です ソースはデバイス関連側
デバイス側のソースのグローバルで宣言したUNIT1を表示させるとうまく行きます。

コード:

void DemoApp::LoadGr(TCHAR *text,ID2D1Bitmap *Gr ){

	if (SUCCEEDED(hr))
        {
            // Create a bitmap by loading it from a file.
            hr = LoadBitmapFromFile(
                m_pRenderTarget,
                m_pWICFactory,
		text,
		0,
                0,
		&UNIT1//←グローバルで宣言してあります。
                );
        }
	//分割コンパイルのテスト簡易化用↓ テスト終了時に消去
	if (SUCCEEDED(hr))
        {
            // Create a bitmap by loading it from a file.
            hr = LoadBitmapFromFile(
                m_pRenderTarget,
                m_pWICFactory,
		text,
		0,
                0,
		&Gr
                );
        }
 
}

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

Re: 分割コンパイルについて

#2

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

それはポインタの理解が不十分だからだと思います。
LoadGrでGr に代入された値はGameMainには戻されません。
それはGrとtestBitは別の変数だからです。

戻り値にするか、ダブルポインタとか参照渡しを勉強された方が良いでしょうが、この場合は戻り値のほうが直感的です。

【補足】
せっかくクラスを使っているのに内部にstaticの変数があるのは感心できません。
Mainだから2つのインスタンスが存在しないんでしょうが、それでも悪い習慣だと思います。

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

奥兵

Re: 分割コンパイルについて

#3

投稿記事 by 奥兵 » 13年前

ご指摘いただいたとおり戻り値にしたら表示できました。ありがとうございます。
ポインタ渡したから値いれてくれるだろ、みたいな適当な理解で書いてました。
毎度ながら素早いアドバイス感謝です。

ついでに質問なんですがクラス内部にstatic変数があるのはどうまずいのか調べてみたんですがよくわかりません。
この場合どう書くのがスマートなんでしょうか?

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

Re: 分割コンパイルについて

#4

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

奥兵 さんが書きました: ついでに質問なんですがクラス内部にstatic変数があるのはどうまずいのか調べてみたんですがよくわかりません。
この場合どう書くのがスマートなんでしょうか?
privateなメンバ変数にするのが一般的でしょうか。
ただ、インスタンスが2つ以上発生しないなら実際には問題は出ないとは思います。
2つ以上のインスタンスを持つクラスでstaticなローカル変数は色々とマズイです。

参考。適当でC言語のprintfを使っていますが。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

class ctest {
public:
	void main() {
		static int a=0;
		printf("%d\n",a++);
	}
};

int main()
{
	ctest ct1;
	ctest ct2;
	
	ct1.main();
	ct2.main();
	ct1.main();
	ct2.main();
}
このコードの動作は良いと思いますか?実行してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

奥兵

Re: 分割コンパイルについて

#5

投稿記事 by 奥兵 » 13年前

なるほど!理解できました。ご丁寧にソースまで貼っていただいてありがとうございした。
おかげでとってもダイレクトに理解できました。感謝です。

閉鎖

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