2013-04-06 20 views
-1

於是找到地圖的項目,我有兩個文本框(早期定義)和兩個向量:由TCHAR鍵名

std::vector<TCHAR*> v1; 
std::vector<int> v2; 

與地圖:

std::map <TCHAR*, int> m1; 
std::map <TCHAR*, int>:: iterator i1; 

地圖初始化:

void mapInit() 
{ 
m1[L"one"] = 1; 
m1[L"two"] = 2; 
m1[L"three"] = 3; 
m1[L"four"] = 4; 
m1[L"five"] = 5; 
m1[L"six"] = 6; 
m1[L"seven"] = 7; 
m1[L"eight"] = 8; 
m1[L"nine"] = 9; 
m1[L"ten"] = 10; 
} 

我應該從第一個文本框中獲得單詞「one」,並將其寫入矢量'v1'(文本框將來必須有更多的單詞,所以我不能在沒有矢量的情況下做到這一點) )。 後,該程序具有通過鍵名在地圖所需的值來查找:

TCHAR *zr = v1.at(0); // v1.at(0) has the word `one` atm 
i1 = m1.find(zr); // want to get value `1` by key `one` 
int z = i1->second; // and get it completely 

我得到了一個調試斷言錯誤「圖/套迭代器不dereferencable」 .. :(

我是否會?做都一樣,但將其更改爲L「一」:

TCHAR *zr = L"one"; // 
i1 = m1.find(zr); 
int z = i1->second; 

所以它的作品... 爲什麼它不與矢量值工作,我用我的調試器的矢量值檢查 - 它'L'one''too!但是不管用......

注:我也試圖找到沒有.find字()方法:

TCHAR *zr = v1.at(0); 
int z = m1[zr]; // - now `z` returns a null... 

如果我會改變 'v1.at(0)' 到L 「一」,它會重新工作

Heeeeeelp :(爲什麼它不工作?

============================================== ===

Yeeeeeeeah現在它的工作! :) 簡單的解決辦法:

wstring zr = v1.at(0); 
int z = m1[zr]; 

雙笑臉) 感謝大家的幫助BRO-S :)

+1

使用'std :: wstring'而不是'TCHAR *' – 2013-04-06 17:36:27

+0

可能重複[std :: map不按預期行事](http://stackoverflow.com/questions/10937605/stdmap-not-behaving-as -expected) – 2013-04-06 17:43:18

+0

謝謝你的回答。方法GetWindowText()允許我從文本框中獲取文本,返回TCHAR值類型...如果我將使用wstring,編譯器會說「std:wstring與LPWSTR不兼容」。我編程的win32應用程序。沒有其他解決方案? ( – FireForce 2013-04-06 17:45:55

回答

0

我想,「地圖/套迭代器不dereferencable」是因爲你試圖指向end()的解引用迭代器,你應該檢查find是否找到了任何東西。

的原因可能是因爲你的地圖:

std::map <TCHAR*, int> m1; 

保持關鍵指針,其值是V1不同的,所以它不能夠找到它。如果你想保留你的設計(迭代所有映射值和打印鍵值,然後在v1中執行相同操作),或者按照正確的方式使用std :: wstring,可以按照註釋中的建議檢查它。

+0

問候它真的無法找到想要的項目所以你是對的地圖不允許我將std :: wstring設置爲一個類型。語法正常,但編譯失敗,出現錯誤C2784:bool std :: operator <(const std :: _樹<_Traits>&,const std :: _樹<_Traits>&):不可能返回模板lalala的參數「和其他幾個錯誤... 無論如何,我明白我的失敗,將嘗試修復它:) – FireForce 2013-04-06 18:18:56

+0

loooooool我忘了添加「包括」我的應用程序,並花了我的生命小時的徒勞....現在是作品:) ) – FireForce 2013-04-06 20:07:25

0

不要使用TCHAR *作爲您的映射鍵,它只會導致您的痛苦和頭痛。你有內存泄漏和/或崩潰引用釋放的內存。

TCHAR只是char的typedef,如果不是unicode,並且wchar_t是unicode的話。

你可以做這樣的事情

typedef std::basic_string<TCHAR> tstring; 

然後聲明地圖作爲

std::map<tstring,int> 

注意不要用一個指針字符串。你應該能夠將GetWindowText返回的任何內容轉換爲tstring。

您可以使用Win32 API的

tstring window_text(max_window_text,0); 
auto ncount = ::GetWindowText(window_hwnd,&window_text[0],window_text.size()); 
if(ncount){ 
    window_text.resize(ncount); 
} else{ 
    // handle failure 
} 

這樣做會爲你節省很多的痛苦。

知道如何從TCHAR *轉換爲std :: string/wstring對於能夠爲Windows編寫良好的本地C++程序非常重要。這是你需要學習的東西,所以如果你在發佈代碼和錯誤方面仍然有問題。如果你不學習如何做到這一點,我會建議你而不是用C++編寫你的程序在Windows中,而不是使用類似C#的東西。