2 / 2 / 0
Регистрация: 18.03.2015
Сообщений: 54
1

Ошибка cannot deference out of range deque operator

16.12.2018, 20:00. Показов 2835. Ответов 15

Все привет!

Столкнулся со следующей ошибкой: cannot deference out of range deque operator

Прошу помочь восстановить работоспособность программы, так как не могу понять с чем связано.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "Pch.h"
#include<iostream>
#include<stack>
#include<string>
#include <fstream>
 
using namespace std;
int main()
{
    cout << "Enter the path to file\n";
    string path;
    string s;
    std::ifstream in("D:\\test.txt"); // окрываем файл для чтения
    
    if (in.is_open())
    {
        while (getline(in, s))
        {
            std::cout << s << std::endl;
        }
    }
    in.close();     // закрываем файл
 
    stack<char> b;
    for (auto c = s.begin(); c != s.end();c++)
    {
        if (*c == ')'&&b.top() == '(' || *c == ']'&&b.top() == '[' ||
            *c == '}'&&b.top() == '{')
            b.pop();
        else if (*c == ')' || *c == ']' || *c == '}')
        {
            cout << "NO";
            return 0;
        }
        else
            b.push(*c);
    }
    b.empty() ? cout << "YES" : cout << "NO";
 
    return 0;
 
}
Добавлено через 13 минут
ПРограмма должна считывать из файла скобочную последовательность и определять, является ли она верной
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2018, 20:00
Ответы с готовыми решениями:

Оператор интервала ( range operator ). Ну почему он так?
Речь пойдёт об операторе &quot;..&quot; и его второй разновидности &quot;...&quot;. Все вы, конечно, знаете, что у...

При вызове объекта Range, VBA самостоятельно меняет Range на rAnge
Всем доброго дня, у меня такой вопрос. По незнанию создал функцию rAnge(), теперь при вызове...

Ошибка method range of object global failed в чем ошибка
Sub ПроверкаВвода() Dim A As Range Dim B As Range ...

Почему в данном случае используется operator int, а не operator double?
Вот программа using System; class ThreeD { int x, y, z; // трехмерные координаты ...

15
Параллельный Кот
1904 / 826 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
16.12.2018, 20:15 2
Лучший ответ Сообщение было отмечено andreas96 как решение

Решение

Цитата Сообщение от andreas96 Посмотреть сообщение
C++
1
2
3
4
5
    for (auto c = s.begin(); c != s.end();c++)
    {
        if (*c == ')'&&b.top() == '(' || *c == ']'&&b.top() == '[' ||
            *c == '}'&&b.top() == '{')
            b.pop();
После создания стек пуст, а первым же действием вы пытаетесь получить значение на вершине стека (которого еще нет). Как получить то, чего нет? Проверяйте стек на !empty() перед попыткой получить из него значение. Цикл и условия можно значительно упростить.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    for (auto c : s) {
        if ((c == ')') || (c == ']') || (c == '}')) {
            if (!b.empty() && (c == b.top())) {
                b.pop();
            }
            else {
                cout << "NO";
                return 0;
            }
        }
        else {
            b.push(c);
        }
    }
1
2 / 2 / 0
Регистрация: 18.03.2015
Сообщений: 54
16.12.2018, 20:28  [ТС] 3
Спасибо!

Тогда еще один вопрос: если создать файл и внести в него последовательность - программа отработает корректно, но если в него внести изменения и сохранить, программа начинает работать некорректно. В чем может быть проблема и как её решить?
0
Параллельный Кот
1904 / 826 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
16.12.2018, 20:50 4
Цитата Сообщение от andreas96 Посмотреть сообщение
В чем может быть проблема и как её решить?
Из текущего описания ничего не понятно. Расскажите подробнее, желательно с кодом. И создайте для этого новую тему, чтобы путаницы не возникало (по правилам один вопрос <=> одна тема).

Добавлено через 17 минут
andreas96, прошу прощения, поспешил изменить проверки. У вас было правильно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    for (auto c : s) {
        if (!b.empty() && ((c == ')') && (b.top() == '(')) || 
            ((c == ']') && (b.top() == '[')) ||
            ((c == '}') && (b.top() == '{')) ) {
            b.pop();
        }
        else if (c == ')' || c == ']' || c == '}') {
            cout << "NO";
            return 0;
        }
        else {
            b.push(c);
        }
    }
1
2 / 2 / 0
Регистрация: 18.03.2015
Сообщений: 54
16.12.2018, 20:55  [ТС] 5
Благодарю, также прошу взглянуть на ошибку по этой же программе
0
Параллельный Кот
1904 / 826 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
16.12.2018, 20:59 6
andreas96, что именно происходит некорректно? Какого рода изменения вносятся в файл? Приведите пример содержимого файла до и после изменений.

C++
1
2
3
4
5
6
7
8
9
10
    std::ifstream in(path); 
    
    if (in.is_open())
    {
        while (getline(in, s))
        {
            std::cout << s << std::endl;
        }
    }
    in.close();
Чтение строк из файла так и должно происходить в цикле? При этом будет обрабатываться только последняя строка, если их там несколько.
0
2 / 2 / 0
Регистрация: 18.03.2015
Сообщений: 54
16.12.2018, 21:02  [ТС] 7
Допустим вводим в новый файл txt последовательность (()).
ПРограмма отрабатывает корректно.

Теперь изменим файл (()){}.
ПРограмма выдает что данная последовательность неверная. При этом если создать новый файл и внести туда данную последовательность, то она будет помечен верно как корректная.

Ну по сути да, нам так как там только одна строка.
0
Мозгоправ
1735 / 1029 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
16.12.2018, 21:13 8
У вас ошибка в алгоритме. Вы читаете закрывающую скобку, а сравниваете с открывающей. А файл тут ни при чём.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<iostream>
#include <stack>
#include <map>
#include <string>
#include <fstream>
 
using namespace std;
 
const map<char, char> mapper{ {'(', ')'}, {'[', ']'}, {'{', '}'} };
 
int main() {
    string s = "((now(non[[bracket{{{  }}symbols}]])ignored))";
    cout << s << endl;
 
    stack<char> b;
 
    for (auto c : s) {
        if ((c == ')') || (c == ']') || (c == '}')) {
            if (!b.empty() && (c == mapper.at(b.top()))) {
                cout << c << endl;
                b.pop();
            }
            else {
                cout << "NO";
                return 0;
            }
        }
        else {
            if (mapper.find(c) != mapper.end())
                b.push(c);
        }
    }
    b.empty() ? cout << "YES" : cout << "NO";
 
    return 0;
}
0
Параллельный Кот
1904 / 826 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
16.12.2018, 21:16 9
andreas96, явных ошибок в программе не вижу, поэтому причины скорее всего в чем-то другом. Проверил на разных входных данных, изменяя один и тот же файл, все работает. Для начала, попробуйте следующие действия:
1. Выведите длину строки, чтобы выяснить, не попало ли в нее что-то лишнее.

C++
1
std::cout << s << "(length: " << s.length() << ")" << std::endl;
2. Запустите отладку и проверьте логику по шагам. Если у вас эта ошибка воспроизводится, то хотя бы скажете, на каком шаге.

Добавлено через 1 минуту
L0M, это уже исправили, точнее вернули как было. Этот вариант моя ошибка из соседней темы.
0
2 / 2 / 0
Регистрация: 18.03.2015
Сообщений: 54
16.12.2018, 21:25  [ТС] 10
Очень странно, но добавил строчку с длиной, и все рабоатет корректно. Магия одним словом. Спасибо!

Добавлено через 1 минуту
А нет поспешил.

()()()()()()()()(){}]

Данная строка почему то не считывается. Длина 0
0
Мозгоправ
1735 / 1029 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
16.12.2018, 21:28 11
Для проверки алгоритма проверки баланса скобок я вообще не вижу разницы читать ли строку из файла, или с консоли, или брать из инициализированной перменной. У ТС есть вывод на консоль той строки, которая пойдёт на анализ. С этого момента вопрос откуда взялась строка не имеет смысла.

Добавлено через 2 минуты
andreas96, а у вас в файле в конце строки символ перевода строки есть?
0
Параллельный Кот
1904 / 826 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
16.12.2018, 21:29 12
andreas96, в файле точно нет пустых строк? Уберите от греха подальше этот цикл, оставьте только чтение одной строки.

C++
1
2
3
4
5
6
7
8
std::ifstream in(path); 
if (in.is_open())
{
    getline(in, s);
    std::cout << s << std::endl;
}
 
in.close();
0
2 / 2 / 0
Регистрация: 18.03.2015
Сообщений: 54
16.12.2018, 21:45  [ТС] 13
убрал цикл, ввел просто статическую строку. Но теперь столкнулся с проблемой из предыдущей темы, выход за переделы.

Добавлено через 1 минуту
символа перевода каретки нет, теперь сделал строку статической, теперь появилась проблема из темы
Ошибка cannot deference out of range deque operator

символа перевода каретки нет, теперь сделал строку статической, теперь появилась проблема из темы
Ошибка cannot deference out of range deque operator
0
Мозгоправ
1735 / 1029 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
16.12.2018, 22:26 14
andreas96, на какой входной строке вы получаете ошибку? Я от своего варианта такого не могу получить.
0
2 / 2 / 0
Регистрация: 18.03.2015
Сообщений: 54
16.12.2018, 22:32  [ТС] 15
()()()()()()()()(){}] - данная строка не срабатывает корректно
0
Мозгоправ
1735 / 1029 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
17.12.2018, 01:43 16
Мой код спокойно отрабатывает:
Код
()()()()()()()()(){}]
)
)
)
)
)
)
)
)
)
}
NO
Добавлено через 7 минут
А если очень смущает map, то можно и без:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<iostream>
#include <stack>
#include <string>
#include <fstream>
 
using namespace std;
 
char mapper(char lbr) {
    switch (lbr) {
    case '(': return ')';
    case '{': return '}';
    case '[': return ']';
    default: return lbr;
    }
}
 
int main() {
    string s = "()()()()()()()()(){}]";
    cout << s << endl;
 
    stack<char> b;
 
    for (auto c : s) {
        if ((c == ')') || (c == ']') || (c == '}')) {
            if (!b.empty() && (c == mapper(b.top()))) {
                cout << c << endl;
                b.pop();
            }
            else {
                cout << "NO";
                return 0;
            }
        }
        else {
            if (mapper(c) != c)
                b.push(c);
        }
    }
    b.empty() ? cout << "YES" : cout << "NO";
 
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2018, 01:43
Помогаю со студенческими работами здесь

Class & operator's |Error: undefined reference to operator
Компилирует нормально, но когда хочу использовать оператор выдает ошибку:undefined reference to...

Ошибка: no match for 'operator>>'
Не могу понять в чем проблема, объясните пожалуйста..

Ошибка в перегрузке operator=
Доброго времени суток! Компилятор ругается на перегрузку оператора присвоения. Задумывалось так,...

Ошибка: no match for 'operator<<'
Добрый вечер! Отрывок из main() cout &lt;&lt; &quot;\n\n LIST &quot; &lt;&lt; endl; list&lt;GradStudent&gt; l;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru