2012-08-04 22 views
0

我在創建的DLL中使用XNA Math時出現問題。我有一個在DLL中的類,它將被導出。它有一個類型爲XMVECTOR的成員變量。在類構造函數中,我嘗試初始化XMVECTOR。我得到在讀訪問衝突讀取位置0x0000000000在DLL類中使用XNA Math

代碼運行是這樣的:

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。我不知道這是否會通過一些進一步的信息有所作爲。

還,而我在這,我還有一個問題:

我也得到警告:結構「_XMMATRIX」需要有DLL接口由類的DLLClass「

的客戶端使用

這是致命的嗎?如果不是,這是什麼意思,我該如何擺脫它?注意這個DLLClass將被導出,並且DLLClass的「客戶端」可能會使用變量「matr」。

任何幫助,將不勝感激。

編輯:只是一些進一步的信息:我已經逐行調試的代碼行,它似乎錯誤發生時,XMLoadFloat3的返回值分配給vect。

+0

編譯並運行VS2012(Visual Studio 2010(v100)工具集)時沒有問題。 – David 2013-07-18 06:04:13

回答

0

你不應該採取匿名變量的地址:

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

你需要

XMFLOAT3 foo(0.0f, 0.0f, 0.0f); 
vect = XMLoadFloat3(&foo); 
+0

這不是問題所在。它仍然使用您的解決方案提供相同的訪問衝突。錯誤發生在解決方案的第二行:vect = XMLoadFloat3(&foo)。 – l3utterfly 2012-08-04 08:09:54

1

此代碼是唯一合法的,如果你是64位原生 - 或 - 建築,如果你使用__aligned_malloc以確保所有DLLClass實例的內存都是16字節對齊的。 x86(32位)mallocnew默認只提供8字節的對齊方式。你可以'幸運'但它不穩定。

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

DirectXMath編程指南Getting Started

你有三種選擇:

  1. 確保DLLClass始終對準
  2. 使用XMFLOAT4XMFLOAT4X4而不是16個字節做明確的負載/店鋪
  3. 使用SimpleMath包裝類型DirectX Tool Kit而不是爲您處理加載/存儲。