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
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
SegFault = Post-Stack-Ablaufverfolgung, um das Problem schnell zu identifizieren – IlBeldus
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. –