Установка ссылки на bool равной stack.top стека логических значений выдает ошибку неверного доступа.Не могу понять, почему это происходит - PullRequest
0 голосов
/ 04 февраля 2019

Следующий код находится в функции, а результат является ссылкой на значение 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 ]

0 голосов
/ 04 февраля 2019

Я понял, что происходит не так.Ничего с кодом, приведенным здесь.У меня была ошибка при форматировании строк, которые я помещал в функцию.Извините, спасибо за помощь.

0 голосов
/ 04 февраля 2019

Во-первых, я вижу, что ваше "if (ch == '!' || ch == '&' || ch == '|')" не имеет смысла.Больше ничего они не могут быть.

Кроме того, если postfix - это std :: string, я уверен, что размер включает в себя завершающий нулевой символ.Так что, вероятно, он пытается что-то вставить туда.

В-третьих, если все это находится внутри функции, и вы возвращаете ссылку, как вы предлагаете (я не вижу фактического прототипа функции), которую вы пытаетесьчтобы вернуть ссылку на локальную переменную стека, которая должна быть уничтожена.

И, как указал Spinkoo, вы также пропускаете разрывы в вашем переключателе ...

...