Expression: vector iterator not dereferencable



  • Hi,
    ich habe folgendes Problem:
    ich habe einen Vektor und schreibe einen Pointer der auf den Anfang des vektors zeigt.
    Nun immer wenn ich komiliere und dann ausführe bekomm ich die Meldung:
    Expression: vector iterator not dereferencable
    Hier is ma der betroffene Code:

    std::ifstream in("in.txt");
    	std::vector<char>source_code;
    	std::copy(
    		std::istreambuf_iterator<char>(in.rdbuf()),
    		std::istreambuf_iterator<char>(),
    		std::back_inserter(source_code));
    
        const char *pos = &source_code.front();
        const char *end = &source_code.back() + 1;
    

    Ich wäre froh, wenn mir jemand helfen könnte und mir vielleicht gerade noch den Fehler erklären.
    Ich verwende den Microsoft Visual C++ 2008 EE compiler. Komischerweise hat es mit Dev-C++ funktioniert.
    gruss

    Lukas



  • Der Compiler sagt dir bestimmt auch in genau welcher Zeile das auftaucht. Wäre nett wenn du die mal markieren könntest.



  • Hi,
    sorry vergessen. Naja das Problem ist, dass er beim kompilieren noch keinen Fehler gibt. Erst nacher beim debuggen oder ausführen.
    Ich hab mal die folgenden Zeilen auskommentiert und dann hats funktioniert:

    const char *pos = &source_code.front();
        const char *end = &source_code.back() + 1;
    

    Naja nur wie kann ich die Zeiger jetzt mal verwenden oder wie deklarier ich die richtig
    gruss

    Lukas



  • #include <boost/spirit.hpp>
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <iterator>
    #include <cctype>
    
    using namespace boost::spirit;
    

    das sind noch die präprozessor direktiven



  • Wenn der Fehler durch genau eine dieser beiden Zeilen verursacht wird, würde ich behaupten die Ursache ist (source_code.size() == 0).



  • merde bin ich blööööd^^
    vielen Dank



  • Hi,
    ich hab da noch eine Frage^^. Ich habe einen text in einen Vektor geladen. Nun habe ich mit boost::spirit die folgende Regel definiert:

    rule<> _str_print = strlit<>("print");
    

    wenn ich jetzt:

    if(parse(pos,end, _str_print).full)
        {
    		cout << "Valid";
        }
    	else {
    		cerr << "Unknown command!";
    }
    

    mache kommt immer Unknown command, wenn im Vektor printprint drin steht. wie kann ich das lösen, dass er mir halt valid ausgibt und dass er es halt 2 mal findet.
    gruss

    Lukas



  • indem du den kleene star benutzt:

    rule<> _str_print = strlit<>("print");	
    rule<> _multi_print = *_str_print; //keinmal oder beliebig oft "print"
    rule<> _multi_print2 = +_str_print; //mindestens einmal "print"
    
    //oder direkt beim parse-aufruf:
    if(parse(pos,end, *_str_print).full)
        {
            cout << "Valid";
        }
        else {
            cerr << "Unknown command!";
    }
    

Anmelden zum Antworten