2016-08-09 46 views
-1

ich einen Segmentation Fault, aber ich bin nicht sicher, woC++ Segmentation fault Vektor

Der Fehler in gdb erzeugt heißt es:

Program received signal SIGSEGV, Segmentation fault. 
0x0000000100003c03 in std::__1::vector<tile, std::__1::allocator<tile> >::operator[] (this=0x0, __n=0) 
at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:1497 
1497  return this->__begin_[__n]; 
(gdb) where 
#0 0x0000000100003c03 in std::__1::vector<tile, std::__1::allocator<tile> >::operator[] (this=0x0, __n=0) 
at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:1497 
#1 g2048::resume (this=0x7fff5fbff990) at ./game.hpp:430 

Und hier ist der Teil des Codes, wo das Problem ist, ich nehme an:

std::vector<std::vector<tile> > board; 

vector<int> readIntoVector() { 
    char c; 
    int temp; 
    bool nonum; 
    vector<int> v; 

    ifstream in("save_game.txt", ios::in); 

    if (!in.is_open()) cout << "Unable to open file" << endl; 
    nonum = false; 
    in >> sscore; 

    while(in.good()) { 
     in >> c; 

     if (isdigit(c)) { //if the input is a number 
      nonum = false; 
      in.putback(c); 
      in >> temp; 
      v.push_back(temp); 
     } 
     else if (c == '|') { //if input is | 
      in >> c; 
      in.putback(c); 
      if (isdigit(c)) nonum = false; //if next character is a number, don't add a 0 
      else nonum = true; //if is not a number, add a zero 
     } 
     else if (c == '#') { //Case for 0 in the first position of the grid in each line 
      in >> c; 
      in.putback(c); 
      if (c == '|') //if next character is |, means there's no number, so add 0 
       nonum = true; 
      else nonum = false; 
     } 
     else nonum = false; 

     if (nonum) 
      v.push_back(0); //add 0 in the vector 
    } 

    in.close(); 

    return v; 
} 

void resume() { 
    cout << "In resume" << endl; 
    vector<int> v = readIntoVector(); 
    cout << "Printing normal vector: "; 
    Print(v); 
    std::reverse(v.begin(), v.end()); 
    cout << "Printing reverse vector: "; 
    Print(v); 
    for (int y = 0; y < size; ++y) 
     for (int x = 0; x < size; ++x) { 
      board[x][y].val = (uint) v.back(); 
      v.pop_back(); 
     } 
    score = sscore; 
} 

Und tile.hpp

//Class tile 
class tile { 

public: 
    tile() : val(0), blocked(false) {} 
    uint val; 
    bool blocked; 
}; 

Ich weiß nicht, ist der Fehler im Code, vielleicht versuche ich einen leeren Vektor zuzuweisen, aber die vom Vektor gelesene Datei enthält immer etwas.

Vielen Dank.

+0

Wo in Ihrem Code passiert die Ausnahme? Wenn Sie sich nicht sicher sind, sollten Sie den Debugger verwenden, um den Code durchzugehen, um ihn zu finden, oder Cout-Anweisungen zu verwenden, damit Sie wissen, wo im Code Sie sich befinden. – NathanOliver

+0

Vektor sollte für eine bestimmte Datenmenge vorbelegt werden – tohaz

+0

Sie sollten sich mit Ihrem Debugger besser vertraut machen. Es ist viel mächtiger, als Ihnen nur die Zeile in einer Bibliothek zu sagen, in der Ihr Code tatsächlich abgestürzt ist. – Kevin

Antwort

0

Sie initialisieren v nicht. Wo initialisierst du auch board? Drittens, wie können Sie sicherstellen, v enthält so viele Elemente wie board?

+0

Der Code ist viel größer, aber ich kann es nicht einfügen. Ich werde v initialisieren und dann werde ich es erneut versuchen. Vielen Dank. –

+0

Das war's, danke für deine Hilfe :) –