トップページ > プログラム > 2015年02月22日 > zvR+mDah

書き込み順位&時間帯一覧

22 位/252 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000000000000033



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
【C++】 DirectX初心者質問スレ Part39 【C】 [転載禁止]©2ch.net

書き込みレス一覧

【C++】 DirectX初心者質問スレ Part39 【C】 [転載禁止]©2ch.net
110 :デフォルトの名無しさん[]:2015/02/22(日) 23:30:36.46 ID:zvR+mDah
ちょっと抽象的に。102です。

_Aという巨(おお)きめのクラス型があり、COM形式互換で定義されているので、
C++だけでなくC言語でもなんとか扱えます(多分VBやC# とかでも)。
で、問題のグローバル変数的なクラスAは
class _A
{
.S
{
// member variables //
.a
.b
.c
...
// member fuctions //
->pa
->pb
->pz
  }
};
という形をしており 実際にアクセスしたいのはA.S.a や A.S.b ないしは
A.S->pa() やA.S->pb() です。

(※前者はメンバ変数、後者は関数ポインタでセッティングされたメンバ関数。)
実行中ずっと使えるグローバル変数は g_Aとして既にあります。
_A g_A;

確かDirectX 9 SDK の2004 October以前までは扱いが簡単だったのです。
ちょっとすっきりそのままではないものの、おおむねフレームワーク中でも
g_A.S.{a | b | ... } や g_A.S->{pa | pb | ...}();

の形式ででアクセスしていましたから。C言語にも移植しやすかった。
【C++】 DirectX初心者質問スレ Part39 【C】 [転載禁止]©2ch.net
111 :デフォルトの名無しさん[]:2015/02/22(日) 23:32:00.64 ID:zvR+mDah
102=110です。

でも DirectX 9c 以降 DirectX 12直前の今(DX11 SDK June 2010とか)に至るまで、すなわち
DXUT
という(サンプル)フレームワークになって以来(私が思うに)幾分トリッキーな方法で A.Sにアクセスしているんです。

グローバルクラス変数 g_A の各メンバ関数の実体アドレスに間接的にアクセスするためのstatic関数が一つ設けてあります。
static FUNCA_POINTER func_a( *_A pA, args...)
{
// 今回問題にしたい、ローカル&staticな変数 m_a //
static FUNCA m_a; // FUNCA型の、staticな実体

m_a = A->S->pa; // pa はFUNCAのポインタ型
m_a = GET_pointerA(&m_a; //
...
return &m_a // g_Aクラス変数のアドレスを返却。
}

どれかのメンバ関数をつかうときはargsを欲しい関数を指すよう変えることで このstatic関数で一律でアクセスします。
l_a = func_a(g_A, args...);

で関数ポインタ(A.Sのメンバ pa や pb など)を捕まえ、使い方は

l_a(args...); l_b(args...); l_c(args...);

となります。この形式だとブレーク中以外は、l_aやl_b がどんなことやってるのかデバッガ上でも見えにくくなります。
FUNCA_POINTER とかでいちいちローカル変数l_a や l_bを作らないと、メンバ関数にアクセスできない。
なんでマイクロソフトさんはこんな面倒なやり方をD3Dサンプルの標準にしてしまったのか? と。

ひょっとして最近のやり方の方が、以前の直(じか)アクセスと比べて、CPUキャッシュをコンパクトに
使ったり、マルチスレッドでもセーフなのかな? といぶかってしまって。。。
【C++】 DirectX初心者質問スレ Part39 【C】 [転載禁止]©2ch.net
112 :デフォルトの名無しさん[]:2015/02/22(日) 23:40:23.80 ID:zvR+mDah
ああそう、static FUNCA_POINTER func_a( *_A pA, args...) {`}
関数内部のstaticクラス変数 m_a への初期化は一回きりです。
static m_a = *(A->S->pa); // 初回呼び出し時にg_Aの実体をm_aにコピー。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。