0

作成中の DLL で XNA Math を使用すると問題が発生します。DLL 内にあり、エクスポートされるクラスがあります。XMVECTOR 型のメンバー変数があります。クラス コンストラクターで、XMVECTOR の初期化を試みます。読み取り場所 0x0000000000 からの読み取りでアクセス違反が発生しました

コードは次のように実行されます。

class DLLClass 
{
public:
    DLLClass(void);
    ~DLLClass(void);
protected:
    XMVECTOR vect;
    XMMATRIX matr;
}

DLLClass::DLLClass(void)
{
    vect = XMLoadFloat3(&XMFLOAT3(0.0f, 0.0f, 0.0f));    //this is the line causing the access violation
}

このクラスは、エクスポートされる DLL 内にあることに注意してください。さらなる情報だけでこれが違いを生むかどうかはわかりません。

また、私がそれに取り組んでいる間、別の質問があります:

警告も表示されます: struct '_XMMATRIX' needs to have dll-interface to be used by clients of class 'DLLClass'

これは致命的ですか?そうでない場合、それは何を意味し、どうすればそれを取り除くことができますか? この DLLClass はエクスポートされ、DLLClass の「クライアント」はおそらく変数「matr」を使用することに注意してください。

どんな助けでも大歓迎です。

編集: 追加情報: コードを 1 行ずつデバッグしましたが、XMLloadFloat3 の戻り値が vect に割り当てられたときにエラーが発生したようです。

4

2 に答える 2

1

このコードは、x64 ネイティブでビルドしている場合、または__aligned_mallocDLLClass のすべてのインスタンスのメモリが 16 バイト アラインされていることを確認するために使用している場合にのみ有効です。x86 (32 ビット)mallocでありnew、デフォルトでは 8 バイトのアラインメントのみを提供します。あなたは「幸運になる」ことができますが、それは安定していません.

class DLLClass 
{
public:
   DLLClass(void);
   ~DLLClass(void);
protected:
   XMVECTOR vect;
   XMMATRIX matr;
}

DirectXMath プログラミング ガイドはじめにを参照してください。

次の 3 つの選択肢があります。

  1. DLLClass が常に 16 バイト アラインされていることを確認する
  2. XMFLOAT4代わりにandを使用し、XMFLOAT4X4明示的なロード/ストアを実行します
  3. 代わりに、ロード/ストアを処理するDirectX ツール キットのSimpleMathラッパー タイプを使用してください。
于 2015-06-04T01:50:12.413 に答える
0

匿名変数のアドレスを取得しないでください。

vect = XMLoadFloat3(&XMFLOAT3(0.0f, 0.0f, 0.0f));

あなたが必要

XMFLOAT3 foo(0.0f, 0.0f, 0.0f);
vect = XMLoadFloat3(&foo);
于 2012-08-04T04:36:41.127 に答える