- 【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にコピー。
|