Аватар для kcalbCube
15 / 13 / 4
Регистрация: 16.08.2018
Сообщений: 125

Runtime ошибка - terminate called after throwing an instance of 'std::out_of_range'

14.10.2018, 05:43. Показов 27528. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу что-то вроде компилятора. Так как никакой литературы по созданию компилятора не читал в моём коде появляються кучи Костылей и велосипедов. Так вот. Эта штука уже понимает где комментарий, видит текст в ковычках. Всё идёт через стринги. Пишу первую команду, var для создания переменной. Хранение переменных сделаю чуть позже, сейчас нужно что-бы программа понимала что это команда var и получала имя этой переменной. Вот что находиться в файле simple.sif(Который обрабатываеться)

var test

Вот parser.cpp

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "parser.h"
 
using namespace std;
 
vector<int> variable;
int toInt(string stringToConvert)
{
    return atoi(stringToConvert.c_str());
}
bool parse(string stringToParse)
{
    if(stringToParse == "\n")
    {
        return 1;
    }
    if(COMMENT(stringToParse) == true)
    {
        return 1;
    }
    printf(INQUOTE(stringToParse).c_str(),"\n");
    cout << Var(stringToParse); //Потом все проверки на команды будут в отдельной функции
 
}


symbol.h
Кликните здесь для просмотра всего текста
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#ifndef SYMBOLE_H
#define SYMBOLE_H
 
#include <string>
#include <iostream>
 
using namespace std;
 
int QUOTE(std::string stringToCheck)
{
    return stringToCheck.find('\"');
}
 
int _QUOTE(std::string stringToCheck)
{
    return stringToCheck.find('\"',QUOTE(stringToCheck)+1);
}
 
std::string INQUOTE(std::string stringToCheck)
{
    bool one = false;
    std::string out = "";
    for (int i = 0; i < stringToCheck.length(); i++)
    {
        if(i >= _QUOTE(stringToCheck))
        {
            return out;
        }
        if(i > QUOTE(stringToCheck))
        {
            out.insert(out.length(),1,stringToCheck.at(i));
        }
    }
    return "";
}
 
 
 
int ARG_START(std::string stringToCheck)
{
    return stringToCheck.find('(');
}
 
int ARG_END(std::string stringToCheck)
{
    return stringToCheck.find(')',ARG_START(stringToCheck)+1);
}
 
template<class A>
A ARG(std::string stringToCheck)
{
    bool one = false;
    A out;
    for (int i = 0; i < stringToCheck.length(); i++)
    {
        if(i >= ARG_START(stringToCheck))
        {
            return out;
        }
        if(i > ARG_END(stringToCheck))
        {
            out.insert(out.length(),1,stringToCheck.at(i));
        }
    }
    return "";
}
 
 
 
bool COMMENT(std::string stringToCheck)
{
    bool one;
    for (auto c : stringToCheck)
    {
        if(c == '/')
        {
            if (one)
            {
                return true;
            }
            else
            {
                one = true;
            }
        }
    }
    return 0;
}
 
#endif


cmd.cpp
Кликните здесь для просмотра всего текста
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
#include "cmd.h"
//
string Var(string stringToCheck)
{
    bool hasSet;
    int cmd_cord[2];
    int i = stringToCheck.find("var");
    if(i != string::npos)
    {
        cmd_cord[0] == i;
        cmd_cord[1] == i+1;
        cmd_cord[2] == i+2;
 
        hasSet == true;
 
        int name_ = stringToCheck.find(' ',cmd_cord[2]+2);
        int name__ = name__-stringToCheck.find(' ',name_);
        return stringToCheck.substr(name_,name__);
    }
    else
    {
        return "";
    }
}


И наконец main.cpp
Кликните здесь для просмотра всего текста
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
#define _GLIBCXX_USE_CXX11_ABI 0
#include <string>
#include <fstream>
#include <stdio.h>
#include "parser.h"
#include <iostream>
 
using namespace std;
 
int main(int args,char* argc[])
{
    ifstream input;
    string code;
    if (args < 1)
    {
        printf("ERROR! Not input files!\n");
        return -1;
    }
    else
    {
    input.open(argc[1]);
    }
 
    while(getline(input,code))
    {
        parse(code);
    }
    return 0;
}


Всё компилируеться, но при запуске выводиться такая ошибка -
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::substr: __pos (which is 18446744073709551615) > this->size() (which is 8)
Aborted (core dumped)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.10.2018, 05:43
Ответы с готовыми решениями:

Ошибка: terminate called after throwing an instance of 'std::bad_alloc'
Доброго времени суток В сурсе #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;vector&gt; #include &lt;array&gt; #include...

Ошибка при повторном запуске: terminate called after throwing an instance of 'std::ios_base::failure'
Здравствуйте, вот этот кусок кода(дан ниже) при повторном запуске программы выдает ошибку: terminate called after throwing an instance of...

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc выделение памяти
Уважаемые форумчане! Работаю над программой обработки WAV файлов, но возникла такая проблема: при чтении файла возникает ошибка ...

4
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
14.10.2018, 06:57
kcalbCube, что не понятно? std::out_of_range? Выход за пределы строки. Или где это происходит? Гони отладчиком найдешь место, или протыкай точками останова все подозрительные места.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
14.10.2018, 07:18
Лучший ответ Сообщение было отмечено kcalbCube как решение

Решение

kcalbCube, что не понятно? падает функция substr
если ты показал все места, где она может быть, то это строчка
stringToCheck.substr(name_,name__);
очевидно, нет вообще никакой проверки на корректность индекса name_
C++
1
int name_ = stringToCheck.find(' ',cmd_cord[2]+2);
что это такое? почему строчкой выше мы помнили и старательно проверяли вариант отсутствия в строке искомого элемента, а сейчас забили? скорее всего именно этот файнд вернул нпос
1
 Аватар для kcalbCube
15 / 13 / 4
Регистрация: 16.08.2018
Сообщений: 125
14.10.2018, 07:47  [ТС]
Я уже начинаю переделывать этот код. И я хочу сообщить то, что я пипец невнимательный. Хотя и вы тоже. Внимательно посмотрите на этот отрезок кода.
Цитата Сообщение от kcalbCube Посмотреть сообщение
C++
1
2
3
cmd_cord[0] == i;
cmd_cord[1] == i+1;
cmd_cord[2] == i+2;
Я блин случайно написал вместо символа присваивания символ сравнивания))))

Добавлено через 2 минуты
Хм, исправил эту ошибку. Всё равно тоже самое. Попробую добавить пару проверок

Добавлено через 4 минуты
Пошло поехало! Появилась другая ошибка - *** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
Вот код -
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
string Var(string stringToCheck)
{
    int cmd_cord[2];
    int i = stringToCheck.find("var");
    if(i != string::npos)
    {
        cmd_cord[0] = i;
        cmd_cord[1] = i+1;
        cmd_cord[2] = i+2;
 
        int name_  = stringToCheck.find(' ',cmd_cord[2]);
        int name__ = stringToCheck.find(' ',name_+1)-name_;
        return stringToCheck.substr(name_,name__);
    }
    else
    {
        return "";
    }
}
Добавлено через 2 минуты
Попробую добавить кучу cout << "DEBUG\n", я так дебажу.

Добавлено через 1 минуту
Ошибка triggered. Добавил cout << name_ << " " << name__ << "\n"; Мне вывело 3 -4, name__ забаган.

Добавлено через 58 секунд
крч походу npos именно там.

Добавлено через 3 минуты
Пофиксил. Теперь координаты нормально показываються var test = стал показывать 3 8. Но *** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
Некуда не делся. Нужно покопаться в функции parse
.
0
0 / 0 / 0
Регистрация: 19.03.2022
Сообщений: 57
05.04.2022, 12:50
Всем привет. В С++ новичок. Необходимо написать программу, которая переводит цену, вводимую как строку, в число типа double. На C-style написал без проблем, но при написании на string возникли следующие проблемы: одна по теме ветки, вторая нет. Вот код:
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
#include <iostream>                                                                                    
#include <string>                                                                                      
#include <typeinfo>                                                                                    
#include <iomanip>                                                                                     
                                                                                                       
int main ()                                                                                            
{                                                                                                      
    std::cout << "Введите сумму: ";                                                                 
    std::string string;                                                                             
    getline (std::cin, string);                                                                     
                                                                                                    
    size_t i = 0;                                                                                   
    std::string stringNew;                                                                          
    std::string stringTamplate = "0123456789.";                                                     
                                                                                                    
    for (size_t count = 0; count < string.length(); ++count)                                        
    {                                                                                               
    ┆   for (size_t j = 0; j < stringTamplate.length(); ++j)                                        
    ┆   {                                                                                           
    ┆   ┆   if (string.at(count) == stringTamplate.at(j))                                           
    ┆   ┆   {                                                                                       
    ┆   ┆   ┆   stringNew[i++] = string.at(count);                                                  
    ┆   ┆   ┆   break;                                                                              
    ┆   ┆   }                                                                                       
    ┆   }                                                                                                                                                                                 
    }                                                                                                  
                                                                                                       
    std::cout << stringNew << '\n';                                                                    
    auto number = std::stod (stringNew);                                                               
    std::cout << typeid(number).name() << std::setiosflags (std::ios::fixed) << " " << number <<  '\n';
                                                                                                       
    return 0;                                                                                          
}
1 проблема: если в строке 22 stringNew[i++] заменить на stringNew.at(i++), то компилируется без проблем, но в rumtime имеем "terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::at: __n (which is 0) >= this->size() (which is 0)
Аварийный останов (стек памяти сброшен на диск)". Не могу понять, как я выхожу за границы строки при методе at?
2 проблема: не выполняется строка 28, нету вывода в консоль.
Работаю на Ubuntu, компилятор g++. Просветите, пожалуйста, как решить эти проблемы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.04.2022, 12:50
Помогаю со студенческими работами здесь

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
При выполнении программы, которая миксует функции в которых создаются типовые задачи, вылезает ошибка, в чем проблема?? #include...

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
Есть задача: Написать программу, которая считывает текст из файла и выводит его на экран, заменив цифры от 0 до 9 на слова...

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
Добрый день!Работаю с графами,и при больших значениях столкнулся с проблемой:ошибка в тесте программы на сайте такова: terminate called...

Не понимаю из-за чего выскакивает: terminate called after throwing instance of std bad_alloc
Не понимаю из-за чего выскакивает ошибка при компиляции: terminate called after throwing instance of std bad_alloc. Буду благодарен, если...

Terminate called after throwing an instance of 'int' Aborted -Ошибка, как быть?
Здравствуйте! Выдается такая ошибка, не понимаю почему. terminate called after throwing an instance of 'int' Aborted команда:...


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

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

Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru