2017-07-27 1 views
0

Ich versuche herauszufinden, warum ich Segmentierungsfehler erhalte, und meine Vermutung ist, dass es in meiner Erinnerungsfunktion ist, die eine Präfixnotation Operation vereinfacht.Präfixnotation C++, Segmentierungsfehler (Stack und Queue) [gelöst]

zum Beispiel

"m + 4 4" Returns: "+ m 8"

während des Tests erhalte ich einen Segmentation Fault-Signal:

mit Signal 11 (SIGSEGV) Exited Ich glaube, aber, dass das Problem in meiner recusive Funktion liegt „Operate“

string Operate(stack<string> &S, queue<string> &Q) 
{ 
    S.push(Q.front()); 
    Q.pop(); 

    std::string::size_type sz; 
    string result = ""; 
    if (IsOperator(S.top()) == true) 
    { 
     S.push(Operate(S, Q)); 
    } 

    if (Q.empty() == false) 
    { 
     S.push(Q.front()); 
     Q.pop(); 
     if (IsOperator(S.top()) == true) 
     { 
      S.push(Operate(S, Q)); 
     } 

     if (S.size() < 3) 
      return "wrong input"; 

     string arg1 = S.top(); 
     S.pop(); 

     string arg2 = S.top(); 
     S.pop(); 

     string oper = S.top(); 
     S.pop(); 

     if (StringIsDigit(arg1) && StringIsDigit(arg2)) 
     { 
      int a = stoi(arg1, &sz); 
      int b = stoi(arg2, &sz); 
      char o = oper.at(0); 

      int c = 0; 

      if (o == '+') 
       c = b + a; 
      else if (o == '-') 
       c = b - a; 
      else if (o == '*') 
       c = b * a; 
      else 
       return "e"; 

      result = to_string(c); 
     } 
     else 
      result = oper + " " + arg2 + " " + arg1; 
    } 
    else 
    { 
     result = S.top(); 
     S.pop(); 
    } 

    return result; 
} 

// die Funktion, die die Segmentierungsfehler verursacht wurde StringIsDigit

bool StringIsDigit(string arg) 
{ 
    bool result = true; 
    //I only need to check if the first is a '-' char and 
    //the next char is not ' '. 
    for (int i = 0; i < arg.size() && result == true; i++) 
    { 
     if ((arg.size() != 1) && (arg.at(0) == '-') && (arg.at(1) != ' ')) 
     i++; 
     else 
      result = isdigit(arg.at(i)); 
    } 
    return result; 
    } 

Link zu dem gesamten Programmcode: https://pastebin.com/04pfE55N

+1

Es klingt wie Sie müssen lernen, wie Sie einen Debugger verwenden, um durch Ihren Code zu gehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: [Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) – NathanOliver

+0

SegFault = Post-Stack-Ablaufverfolgung, um das Problem schnell zu identifizieren – IlBeldus

+0

Danke für die schnelle Rückmeldung! Ich finde den Fall nicht, in dem mein Programm bricht. Aber ich denke, dass ich weiterhin Testfälle erstellen kann, um herauszufinden, wo es bricht. –

Antwort

0

Die Antwort war ganz einfach, mein Fehler: SEGFAULT wurde so viele für mich aus dem Speicher in Lesefehler hingewiesen, segmentation fault, wiki.

Wann ist der Segfault aufgetreten? Es war, wenn meine Funktion StringIsDigit() versuchte herauszufinden, ob negative Werte über 2 Zeichen eine ganze Zahl war. In der "if-Anweisung, als ich nachprüfte, ob der String tatsächlich eine ganze Zahl war, zB -100", las ich den String weiter, bis ich das Ende des Arg-Strings erreichte, aber mit arg.at (i + 1). Führt zu dem Code, der versucht, auf Speicher außerhalb des Stringarrays zuzugreifen. Danke Struthersneil für das Finden dieses Fehlers!

Bitte schauen Sie auf meine alten StringIsDigit() Fehler, die von durch einen Wert, um herauszufinden, ich gemacht:

bool StringIsDigit(string arg) 
{ 
    bool result = true; 
    for (int i = 0; i < arg.size() && result == true; i++) 
    { 
     if ((arg.size() != 1) && (arg.at(0) == '-') && (arg.at(i + 1) != ' ')) 
      i++; 
     else 
      result = isdigit(arg.at(i)); 
    } 
    return result; 
} 

Die Lösung Die Lösung, die ich sicherstellen möchten, dass die Zeichenfolge eine ganze Zahl war seit Mein Algorithmus unterstützt Ausdrücke wie x + 3. Dies bedeutet, dass ich durch die Zeichenfolge issigit() für jedes Zeichen im String-Array durchlaufen muss. Obwohl '-' keine ganze Zahl ist, wird '-' offensichtlich benötigt, um eine negative ganze Zahl auszudrücken, also habe ich eine fehlerhafte Überprüfung vorgenommen, wie Sie in meiner alten StringIsDigit() sehen können. Anstatt diese bedingte if-Anweisung zu verwenden, habe ich überprüft, ob das erste Zeichen "-" und die zweite kein Leerzeichen ist, und dann lasse ich einfach die isdigit() - Funktion den Rest der Arbeit erledigen.

bool StringIsDigit(string arg) 
{ 
    bool result = true; 
    //I only need to check if the first is a '-' char and 
    //the next char is not ' '. 
    for (int i = 0; i < arg.size() && result == true; i++) 
    { 
     if ((arg.size() != 1) && (arg.at(0) == '-') && (arg.at(1) != ' ')) 
      i++; 
     else 
      result = isdigit(arg.at(i)); 
    } 
    return result; 
}