Установка ссылки на bool равной stack.top стека логических значений выдает ошибку неверного доступа. Не могу понять, почему это происходит
Следующий код находится в функции, а результат является ссылкой на значение bool.
trueValues и false Значения - это наборы символов, которые приводят к утверждению true или false.
stack<bool> operandStack;
for (int k = 0; k < postfix.size(); k++)
{
char ch = postfix[k];
if (ch != '!' && ch != '&' && ch != '|')
{
if (trueValues.contains(ch))
{
operandStack.push(true);
}
if (falseValues.contains(ch))
{
operandStack.push(false);
}
}
else if (ch == '!' || ch == '&' || ch == '|')
{
bool operand2 = operandStack.top();
operandStack.pop();
bool operand1 = operandStack.top();
operandStack.pop();
switch(ch)
{
case '!':
operandStack.push(operand1 != operand2);
case '&':
operandStack.push(operand1 && operand2);
case '|':
operandStack.push(operand1 || operand2);
}
}
}
result = operandStack.top();
Комментируя result =
строка избавляется от сообщения об ошибке.
2 ответа
Я понял, что происходит не так. Ничего с кодом, приведенным здесь. У меня была ошибка при форматировании строк, которые я помещал в функцию. Извините, спасибо за помощь.
Во-первых, я вижу, что ваше "if (ch == '!' || ch == '&' || ch == '|')" не имеет смысла. Больше ничего они не могут быть.
Кроме того, если "postfix" является std::string, я уверен, что размер включает в себя завершающий нулевой символ. Так что, возможно, он пытается что-то вспомнить.
В-третьих, если все это находится внутри функции, и вы возвращаете ссылку, как вы предлагаете (я не вижу фактического прототипа функции), вы пытаетесь вернуть ссылку на локальную переменную стека, которая должна быть уничтожена.
И, как указал Spinkoo, вы также пропускаете перерывы в переключателе...