2016-07-07 101 views
-1

我被編碼在USACO培訓Page的問題之一,插入功能,當我試圖調試我的代碼:當我嘗試輸入「ANDY哈里」0xC0000005:執行地址0x00000000的訪問衝突。當試圖訪問多重映射

#include <iostream> 
#include<fstream> 
#include<string> 
#include<map> 
#include<math.h> 
using namespace std; 
int translate(string &s) { 
    int n = s.length(); 
    int result = 0; 
    for (int i = 0; i < s.length(); i++) { 
     int n1 = 0; 
     if (s.at(i) == 'Q' || s.at(i) == 'Z') { 
      return -1; 
     } 
     switch (s.at(i)) { 
     case 'A': 
     case 'B': 
     case'C': 
      result = result + 2 * pow(10, n-1); 
      n--; 
      break; 
     case 'D': 
     case 'E': 
     case'F': 
      result = result + 3 * pow(10, n - 1); 
      n--; 
      break; 
     case 'G': 
     case 'H': 
     case 'I': 
      result = result + 4 * pow(10, n - 1); 
      n--; 
      break; 
     case 'J': 
     case 'K': 
     case 'L': 
      result = result + 5 * pow(10, n - 1); 
      n--; 
      break; 
     case 'M': 
     case 'N': 
     case 'O': 
      result = result + 6 * pow(10, n - 1); 
      n--; 
      break; 
     case 'P': 
     case 'R': 
     case 'S': 
      result = result + 7 * pow(10, n - 1); 
      n--; 
      break; 
     case 'T': 
     case 'U': 
     case 'V': 
      result = result + 8 * pow(10, n - 1); 
      n--; 
      break; 
     case 'W': 
     case 'X': 
     case 'Y': 
      result = result + 9 * pow(10, n - 1); 
      n--; 
      break; 
    } 
    } 
    return result; 
} 
bool mycompare(int n, int m) { 
    string a, b; 
    a = to_string(n); 
    b = to_string(m); 
    if (a < b) { 
     return true; 
    } 
    else return false; 
} 
int main() { 
    bool(*ptr)(int, int); 
    typedef multimap<int, string, bool(*)(int, int)> mmid; 
    mmid pairs(ptr); 
    string s1; 
    ifstream inFile("dict.txt", ios::in | ios::binary); 
    while (cin>>s1) { 
     int f =translate(s1); 
     pairs.insert(mmid::value_type(f, s1)); 
    } 
    int m; 
    cin >> m; 
    multimap<int, string>::iterator it; 
    while (true) { 
     it = pairs.find(m); 
     if (it != pairs.end()) { 
      cout << it->second << endl; 
      pairs.erase(it); 
     } 
     else { 
      break; 
     } 
    } 


    return 0; 
} 

,當它處理到第二個條目時,

pairs.insert(mmid::value_type(f, s1)); 

在這一行它給我代碼0xC0000005:執行位置0x00000000的訪問衝突。我的代碼有什麼問題?爲什麼它給我的錯誤信息不是在第一個入口,而是在第二個入口?謝謝。

+2

因爲您重寫標準比較對象,您在哪裏設置比較對象? – NathanOliver

+2

「當我試圖調試我的代碼時」 - 這聽起來像是你的真正意思是_test_而不是調試。那麼,現在你的測試已經揭示了一個_bug_,所以你需要*去追蹤它。調試的方法是使用調試器!有了它,你就可以在故障發生後(或在任意的中斷點)運行堆棧跟蹤,以查看導致問題的功能的確切調用鏈,從那裏你可以找出原因。你有沒有嘗試過使用調試器? –

+1

爲什麼在程序結束時你有一個無限的'while'循環? – PaulMcKenzie

回答

2

我認爲這個問題是這樣的代碼:

bool(*ptr)(int, int); 
mmid pairs(ptr); 

在第一行,你定義一個名爲ptr一個函數指針,但是你離開它未初始化。這意味着當您使用ptr初始化pairs時,您正在使用垃圾比較函數指針進行初始化。

要解決這個問題,請傳入您想要使用的實際比較函數。例如:

mmid pairs(mycompare); 

此外,該代碼是相當可疑:

multimap<int, string>::iterator it; 
it = pairs.find(m); 

注意,multimap的類型不匹配的pairs的類型,所以沒有一個先驗的理由懷疑這迭代器會正常工作。請考慮這個:

mmid::iterator it; 
+0

爲了闡明OP,在這種情況下,函數指針_happened_爲空指針'0',但它可以是任何東西 - 或者什麼也不是! - 因爲讀取單位變量是未定義的行爲。並且從評論中重複我對最後一個問題的回答:第一個'insert()'不會發生的原因是因爲'map'不需要(不能)比較。 –

+0

我按照你的建議改變了代碼,它工作。謝謝。 – harry47341

相關問題