2012-08-08 81 views
0

我目前使用C++與Direct3D,並試圖改變我的資產存儲。C++ std :: map字符串指針

現在我的資產被存儲爲「vector textureList」並且使用枚舉定義獲得。

我想通過使用STL地圖類來使類更加開放。不過,我從來沒有使用過這門課,而且我遇到了我只是不明白的問題。

我剛纔做任何事情都很裸機測試,目前有以下幾種:

#include <d3d9.h> 
#include <d3dx9.h> 
#include <map> 
#include <string> 

#pragma comment (lib, "d3d9.lib") 
#pragma comment (lib, "d3dx9.lib") 

using namespace std; 


class Assets 
{ 
private: 
typedef std::map<string, IDirect3DTexture9*> TexMap; 
TexMap textureList; 

public: 
IDirect3DTexture9* LoadTexture(IDirect3DDevice9* pd3dDevice, LPCWSTR file, string key) 
{  
    //load a texture from file 
    IDirect3DTexture9*  tex; 


    //D3DXCreateTextureFromFile(pd3dDevice, file, &tex); 
    D3DXCreateTextureFromFileEx(pd3dDevice, file, 512, 512, 0, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0xFF000000, NULL, NULL, &tex); 


    //store the loaded texture to a vector array 
    textureList.insert(TexMap::value_type(key, tex)); 
    return S_OK; 
} 
} 

當我試圖運行此我得到一個「調試斷言失敗」錯誤與表達「圖/套迭代器不兼容「

我只是覺得我已經在代碼中儘可能簡化了代碼,並且仍然無法從類似的例子中看到錯誤。正是如此它只是使用int,我仍然得到同樣的錯誤

#include <d3d9.h> 
#include <d3dx9.h> 
#include <map> 
#include <string> 

#pragma comment (lib, "d3d9.lib") 
#pragma comment (lib, "d3dx9.lib") 

using namespace std; 

class Assets 
{ 
private: 
typedef std::map<int, int> TexMap; 
TexMap textureList; 

public: 

IDirect3DTexture9* LoadTexture(IDirect3DDevice9* pd3dDevice, LPCWSTR file, string key) 
    {  

    //load a texture from file 
    IDirect3DTexture9*  tex; 


    //D3DXCreateTextureFromFile(pd3dDevice, file, &tex); 
    D3DXCreateTextureFromFileEx(pd3dDevice, file, 512, 512, 0, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0xFF000000, NULL, NULL, &tex); 


    //store the loaded texture to a vector array 
    //textureList.push_back(tex); 
    textureList.insert(TexMap::value_type(3, 4)); 
    return S_OK; 
} 
} 

我也運行的代碼。

+0

什麼是調用代碼?那裏沒有「主」。我的猜測是你在某個地方使迭代器無效。 – netcoder 2012-08-08 19:33:43

+0

是的,目前主要功能加載場景管理器,場景管理器創建資產類別。我會將主要和任何相關部分的代碼添加到第一篇文章中。迭代器如何失效? – user1539405 2012-08-08 20:08:52

+0

請參閱[迭代器失效規則](http://stackoverflow.com/questions/6438086/iterator-invalidation-rules)。 – netcoder 2012-08-08 20:11:45

回答

0

實際上這個錯誤可能是非常基本的 - D3DXCreateTextureFromFileEx想要輸入IDirect3DTexture9*作爲其最後一個參數,但是您輸入了IDirect3DTexture9**。也就是說,改變

D3DXCreateTextureFromFileEx(..., &tex); 

D3DXCreateTextureFromFileEx(..., tex); 
+0

實際上這個函數是在IDirect3DTexture9 **之後(或者更具體地說是「LPDIRECT3DTEXTUR9 * ppTexture」)。除此之外,當我使用基於矢量的存儲時,紋理加載正常。謝謝你。 – user1539405 2012-08-08 20:06:47

+0

考慮到這個函數調用中沒有任何東西使用'map',我懷疑這是問題所在。 – netcoder 2012-08-08 20:12:39