ヘッダーファイルで定義済みの構造体が使えない

[戻る]
たま 2005/08/31(水) 14:15:21
初歩的な質問ですみません。

ヘッダーファイルで定義された構造体を使用したいのですが、コンパイル時に
「定義されていない識別子です」と怒られてしまいます。

ヘッダーファイルはソースファイルと同じフォルダに置いて、
#include "d3d9types.h"
のように、記述しています。

よろしくお願いいたします。

επιστημη [E-Mail] 2005/08/31(水) 14:36:07
情報なさすぎ。どの構造体を/どんな状況下で使ったか(and/or ソースコード)を
明記しないと「そんなことあるわけない」と答えるしかありません。

おそらくは #if 〜 #endif の類で囲まれていて、
条件コンパイルで消えてしまってるんだろうと"推測"できますが。

うちだ 2005/08/31(水) 14:55:19
他には・・・
#include "d3d9types.h"
と記述するより前に(上の行で)構造体を宣言している
・・・ってのはあんまりないかぁ

たま 2005/08/31(水) 15:10:15
επιστημηさん、回答ありがとうございます。
すみません、情報が足りませんでしたので補足させていただきます。

使用したい構造体は
d3d9types.hに定義されている
typedef struct _D3DVIEWPORT9 {
    DWORD       X;
    DWORD       Y;            /* Viewport Top left */
    DWORD       Width;
    DWORD       Height;       /* Viewport Dimensions */
    float       MinZ;         /* Min/max of clip Volume */
    float       MaxZ;
} D3DVIEWPORT9;
です。

ヘッダファイルの中身は次のようになっています。(長いので一部)
見る限り条件付コンパイルは_D3DVIEWPORT9に関してはされていないようです。
--------------ここから---------------------
#ifndef D3DCOLORVALUE_DEFINED
typedef struct _D3DCOLORVALUE {
    float r;
    float g;
    float b;
    float a;
} D3DCOLORVALUE;
#define D3DCOLORVALUE_DEFINED
#endif

#ifndef D3DRECT_DEFINED
typedef struct _D3DRECT {
    LONG x1;
    LONG y1;
    LONG x2;
    LONG y2;
} D3DRECT;
#define D3DRECT_DEFINED
#endif

#ifndef D3DMATRIX_DEFINED
typedef struct _D3DMATRIX {
    union {
        struct {
            float        _11, _12, _13, _14;
            float        _21, _22, _23, _24;
            float        _31, _32, _33, _34;
            float        _41, _42, _43, _44;

        };
        float m[4][4];
    };
} D3DMATRIX;
#define D3DMATRIX_DEFINED
#endif

typedef struct _D3DVIEWPORT9 {
    DWORD       X;
    DWORD       Y;            /* Viewport Top left */
    DWORD       Width;
    DWORD       Height;       /* Viewport Dimensions */
    float       MinZ;         /* Min/max of clip Volume */
    float       MaxZ;
} D3DVIEWPORT9;

/*
 * Values for clip fields.
 */
 
--------------ここまで---------------------


構造体を使用している箇所は次のようになっています。
--------------ここから---------------------
#include "d3d9types.h"
void Render(LPDIRECT3DDEVICE8 lpD3DDEV, HWND hWnd)
{
    D3DXMATRIX mWorld, mRotX, mRotY, mTrans;
    float time = (float)timeGetTime();
//    D3DXMatrixRotationY(&mRotY, time/600.0f);
//    D3DXMatrixRotationY(&mRotY, 0.0f);
//    D3DXMatrixRotationX(&mRotX, time/300.0f);
//    D3DXMatrixRotationX(&mRotX, 0.0f);
    POINT pt;
//    RECT rect;

    float x, y;
    GetCursorPos(&pt);
//    GetClientRect(hWnd, &rect);
    ScreenToClient(hWnd, &pt);
    x = (float)pt.x; //- rect.right;
    y = (float)pt.y; //- rect.bottom;
    D3DXMatrixTranslation(&mTrans, 1.0f, 0.0f, 0.0f);
//    mWorld = mRotX * mRotY * mTrans;
    mWorld = mTrans;
    D3DXMATRIX mView, mProj;
    D3DXMatrixLookAtLH(&mView
                    ,&D3DXVECTOR3(0,0.0f,30.0f)    // カ
メラ位置
                    ,&D3DXVECTOR3(0,0,0)    
    // カメラの注目点
                    ,&D3DXVECTOR3(0,1,0)    
    // 上の向き
                    );
    D3DXMatrixPerspectiveFovLH(&mProj
        ,60.0f*PI/180.0f                    
    // 視野角
        ,1.0f                        
            // アスペクト比
        ,0.01f                        
            // 最近接距離
        ,100.0f                        
            // 最遠方距離
        );
    lpD3DDEV->SetTransform(D3DTS_WORLD, &mWorld);
    lpD3DDEV->SetTransform(D3DTS_VIEW,  &mView);
    lpD3DDEV->SetTransform(D3DTS_PROJECTION, &mProj);

    //ビューポート変換
    D3DVIEWPORT9 viewData1 = {0, 0, WIDTH/2, HEIGHT/2, 0.0f, 1.0f };
    D3DVIEWPORT9 viewData2 = {WIDTH/2, 0, WIDTH/2, HEIGHT/2, 0.0f, 1.0f };
    D3DVIEWPORT9 viewData3 = {0, HEIGHT/2, WIDTH/2, HEIGHT/2, 0.0f, 
1.0f };
    D3DVIEWPORT9 viewData4 = {WIDTH/2, HEIGHT/2, WIDTH/2, HEIGHT/2 ,0.0f, 
1.0f };

    lpD3DDEV->SetViewport(&viewData1);
    lpD3DDEV->SetViewport(&viewData2);
    lpD3DDEV->SetViewport(&viewData3);
    lpD3DDEV->SetViewport(&viewData4);



    lpD3DDEV->SetStreamSource( 0, pVB, sizeof(CUSTOMVERTEX) );
    lpD3DDEV->SetVertexShader( D3DFVF_CUSTOMVERTEX );
    lpD3DDEV->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 3 );
}
--------------ここまで---------------------

ひとつ気になることがあるのですが、参考になるでしょうか。
FileViewの外部依存関係に上のヘッダファイルとファイル名が似ている「d3d8types.h」
というファイルが含まれています。(このヘッダファイルには上に述べた構造体は定義
されていません)
この「d3d8types.h」が読み込まれて「d3d9types.h」が無視されているように思いま
す。

たま 2005/08/31(水) 15:14:07
うちださん、回答ありがとうございます。

#include "d3d9types.h"
より上で構造体を宣言〜
といっている構造体とはD3DVIEWPORT9のことでしょうか?

それでしたら、していません。

επιστημη [E-Mail] 2005/08/31(水) 16:05:29
> この「d3d8types.h」が読み込まれて「d3d9types.h」が無視されているように思います。

なんか匂いますね (^^
d3d8types.h は #include しなければならないのでしょうか?
d9 が d8 を"包含"しているのなら、d8は#include不要でしょうけど。

気分屋 2005/08/31(水) 16:31:31
d3dx8.hかd3d8.hを先にインクルードしているからでしょ。
上記のヘッダーをインクルードするとd3d8types.hもインクルードされる。

後はd3d9types.hの中身を見れば、なぜD3DVIEWPORT9が適用されていないのかは一目瞭
然。
だいたい、デバイスをDirectX8で作成して、デバイスに関連する構造体を
DirectX9で定義されているものを使おうとすること自体が間違い。

後、BBXでマルチポストしてないかい?

たま 2005/08/31(水) 16:33:39
επιστημηさん、回答ありがとうございます。

επιστημηさんのおっしゃるとおりです。
d9 は d8 を"包含"しているのでd8は#include不要です。

実は、d9もd8も「プロジェクトの設定」で設定したインクルードパス配下に
含まれています。
したがって、d8には無くてd9には有る構造体を使用しても
インクルードしてくれると思ったのですが、うまくいかなかったので
d9をソースファイルと同じフォルダに置いて#include "d3d9types.h"
としました。
このようにソースに直に書けばd8よりd9を優先してくれると思ったのです。

d9を使用するにはd8をインクルードパスから削除するしかないのでしょうか?

たま 2005/08/31(水) 16:36:44
気分屋さん、回答ありがとうございます。

たしかにデバイスはDirectX8で作成しております。

ちなみに、ここで聞いたことを別の掲示板に聞くことが悪いことでしょうか?

ここでは、VC++の質問として、もう一方ではDirectXとしての質問しているつもりです。

たま 2005/08/31(水) 16:41:52
[[解決]]
気分屋さん、ヘッダーファイルの中身を見ました。

なぜ、インクルードされていないかが、わかりました。
DIRECT3Dのバージョンをみていたのですね。

バージョンを9.0にして作り直します。

回答してくださったみなさん、ありがとうございました。

解決です。

気分屋 2005/08/31(水) 16:43:53
別の掲示板で聞くのはいいけど、
別の掲示板で聞いていることを、この掲示板に書いておかないと
大抵の人は、「マルチポストなら答える必要もないや」と思うのが一般だと思います。

マルチポストは一言断って行わないと、悪い印象しかあたえないのではないでしょう。

たま 2005/08/31(水) 16:47:48
気分屋さん、ご指摘ありがとうございます。

以降、気をつけます。

PATIO 2005/08/31(水) 16:56:50
あと、質問している掲示板の趣旨が違っていても質問内容が同じなら
両方の掲示板に対して同じようにフォローする必要がありますし、
最終的にマルチポストした掲示板全てに事の顛末と解決方法に関する書き込みをする必要
があると思います。
マルチポストが嫌われる原因の一つにこうした後始末をきちんとしない人が多いと言う事
があげられています。

たま 2005/08/31(水) 17:06:39
PATIOさん、ご指摘ありがとうございます。

もう一方の掲示板には、解決した旨を報告しております。
他の掲示板でも質問していたことにはついては、
返信がひとつもついていない状態ですので、必要ないと判断しました。

お騒がせしました。

KING・王 2005/08/31(水) 17:40:15
> 他の掲示板でも質問していたことにはついては、
> 返信がひとつもついていない状態ですので、必要ないと判断しました。

ということは、それらの掲示板では、後始末をしていないのですか?
マルチポストだから、みんな返信をしてくれないだけかもしれませんが。。。


PATIOさんが、

> 最終的にマルチポストした掲示板全てに事の顛末と解決方法に関する書き込みをする必要
> があると思います。

と、指摘されているように、仮にひとつも返信がついていなくても、また、自己解決しても、
一度質問した内容に関しては、質問した本人が結果報告する必要があると思われます。

今後、検索などで、その書き込みを見つけた人がいた場合、どのように解決したかわかりません
ので、
最低限でも、解決方法を記載されているページへのリンクは必要でしょう。

たま 2005/08/31(水) 19:01:33
KING・王さん、ご指摘ありがとうございます。

17:06:39に返信していますが、解決方法は報告済みです。

REE 2005/08/31(水) 19:35:48
KING・王さんの解釈(自分もこうでした)
 もう一方の掲示板(返信あり) ≠ 他の掲示板(返信なし)
 もう一方の掲示板には報告したけど
 他の掲示板では報告していない

事の真相
 もう一方の掲示板(返信なし) = 他の掲示板(返信なし)
 結果報告はしたけど、返信がなかったから事の顛末までは報告不要と判断

古いスレッドには追加発言できません。