Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/120: Рейтинг темы: голосов - 120, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 72

Vector subscript out of range

23.06.2014, 05:43. Показов 24692. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, друзья, у меня следующая проблема:
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
if (!MeteorVec.empty())
            {
                for (int i = 0; i < MeteorVec.size(); i++)
                {
                    MeteorVec[i]->Moove();
                    if (RectCrossesRect (bullet->borderRect, MeteorVec[i]->borderRect))
                    {
                        MeteorVec[i]->GetsDestroyed(hwnd);
                        bullet->Dissapears();
                        Meteors* p = MeteorVec[i];
                        MeteorVec[i] = MeteorVec.back();
                        MeteorVec.pop_back();
                        delete p;
                    }
                    if (RectCrossesRect (ship->borderRect, MeteorVec[i]->borderRect) && ship->exists)
                    {
                        ship->GetsDestroyed();
                        SetTimer(hwnd, 5, 1000, NULL);
                        Meteors* p = MeteorVec[i];
                        MeteorVec[i] = MeteorVec.back();
                        MeteorVec.pop_back();
                        delete p;
                    }           
                    if (MeteorVec[i]->position.x < 30)
                    {
                        Meteors* p = MeteorVec[i];
                        MeteorVec[i] = MeteorVec.back();
                        MeteorVec.pop_back();
                        delete p;
                    }
                }
            }
все выполняется внутри таймера, MeteorVec - это вектор. Так вот, иногда вылезает ошибка: "vector subscript out of range", может я просто по глупости не вижу очевидного, но никак не могу вкурить, в какой момент он может вылезти за пределы? И как исправить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.06.2014, 05:43
Ответы с готовыми решениями:

Struct / Vector / Expression: vector subscript out of range
Добрый вечер. Имеется структура: struct Contact { public: string name; vector&lt;string&gt; phoneNumber; };

vector subscript out of range
Доброго времени суток! Подскажите пожалуйста, где именно я ошибся, вроде не должен он за пределы выходить по коду: const...

Vector subscript out of range
int main() { srand( time(0) ); vector &lt;int&gt; m(10000); int i,n,c,max; while(i&lt;=10000) { m.push_back(rand()%4); i++; }...

15
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2014, 06:19
Предположим, что в одном из первых if() происходит удаление последнего элемента вектора (MeteorVec.pop_back()), вектор пуст, но в следующем if() будет обращение по индексу к пустому вектору (например, if (MeteorVec[i]->position.x < 30)), что и вызовет ошибку. После каждого удаления нужно проверять вектор на пустоту, и выполнять нужные действия, в зависимости от результата проверки.
2
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
23.06.2014, 09:18
Цитата Сообщение от alsav22 Посмотреть сообщение
Предположим, что в одном из первых if() происходит удаление последнего элемента вектора (MeteorVec.pop_back()), вектор пуст, но в следующем if() будет обращение по индексу к пустому вектору (например, if (MeteorVec[i]->position.x < 30)), что и вызовет ошибку.
Не думаю:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
struct sd {
  int a;
  sd(int A): a(A)
  {}
};
int main() {
  std::vector<sd> coll;
  //coll.reserve(2);
  coll.push_back(11);
  coll.pop_back();
  coll.pop_back();
  coll.pop_back();
  coll.pop_back();
  std::cout << coll[59].a << std::endl;
 
  return 0;
}
Компилится без проблем и кидает искючение только если векторе не выделена память для элементов. Так что кто кидает исключение вопрос открытый.
Антон219, посмотрите в своей реализации кто может кидать такое исключение.
1
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
23.06.2014, 11:08
Цитата Сообщение от Ilot Посмотреть сообщение
Не думаю:
Читаем тут http://www.cplusplus.com/refer... /pop_back/
If the container is not empty, the function never throws exceptions (no-throw guarantee).
Otherwise, it causes undefined behavior.
Так же, если контейнер окажется пустым, то
C++
1
MeteorVec[i] = MeteorVec.back();
будет тоже не здорово себя вести
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
23.06.2014, 11:35
Croessmah, так я же и говорю, что пусть смотрит в своей реализации. Так как в GCC эти методы объявлены так:
C++
1
2
3
4
5
6
7
8
9
10
11
      void
      pop_back() _GLIBCXX_NOEXCEPT
      {
    ...
      }
      reference
      back() _GLIBCXX_NOEXCEPT
      { return *(end() - 1); }
      const_reference
      back() const _GLIBCXX_NOEXCEPT
      { return *(end() - 1); }
Что как бы намекает, что исключение кидать они не могут.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2014, 18:33
Цитата Сообщение от Ilot Посмотреть сообщение
Так что кто кидает исключение вопрос открытый.
Вот код и результат работы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
using namespace std;
 
int main() 
{
    vector<int> coll;
    coll.push_back(11);
    coll.pop_back();
    int i = 1;
    if (coll[i] == 3)
        cout << coll[i] << endl;
    else 
        cout << "No!" << endl;
 
    system("pause");
    return 0;
}
Миниатюры
Vector subscript out of range  
1
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 72
23.06.2014, 21:42  [ТС]
Вроде исправил!)) Как я понимаю, проблема могла быть, если один из блоков if() пытался обращаться к уже несуществующему элементу. Я поставил цикл for() один и тот же перед каждым блоком if():
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
for (int i = 0; i < MeteorVec.size(); i++)
                {
                    MeteorVec[i]->Moove();
                    if (RectCrossesRect (bullet->borderRect, MeteorVec[i]->borderRect))
                    {
                        MeteorVec[i]->GetsDestroyed(hwnd);
                        bullet->Dissapears();
                        if (i < MeteorVec.size())
                        {
                            delete MeteorVec[i];
                            MeteorVec.erase(MeteorVec.begin() + i);
                        }
                    }
                }
                for (int i = 0; i < MeteorVec.size(); i++)
                {
                    if (RectCrossesRect (ship->borderRect, MeteorVec[i]->borderRect) && ship->exists)
                    {
                        ship->GetsDestroyed();
                        SetTimer(hwnd, 5, 1000, NULL);
                        if (i < MeteorVec.size())
                        {
                            delete MeteorVec[i];
                            MeteorVec.erase(MeteorVec.begin() + i);
                        }
                    }   
                }
                for (int i = 0; i < MeteorVec.size(); i++)
                {
                    if (MeteorVec[i]->position.x < 30)
                    {
                        if (i < MeteorVec.size())
                        {
                            delete MeteorVec[i];
                            MeteorVec.erase(MeteorVec.begin() + i);
                        }
                    }
                }
Удаление тоже изменил, но даже с проверкой if (i < MeteorVec.size()) это не помогло. Помогло только добавление for.
Спасибо за помощь!)
И еще ламерский вопрос: Ilot, как мне понять, по моей реализации, что кидает исключение? Что вообще может его кидать?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2014, 21:57
Цитата Сообщение от Антон219 Посмотреть сообщение
как мне понять, по моей реализации, что кидает исключение? Что вообще может его кидать?
Берёте отладчик и смотрите, в каком месте кода возникает исключение.
2
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
23.06.2014, 23:05
Цитата Сообщение от alsav22 Посмотреть сообщение
как мне понять, по моей реализации, что кидает исключение? Что вообще может его кидать?
Вообще есть стандарт языка, там всё поведение специфицировано, в кишки своей реализации лезть не обязательно. Справку можно посмотреть например здесь или тут.
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
24.06.2014, 08:15
alsav22, как видно у вас кидает исключение отладчик, т.е. среда. Как я и говорил. Вы не пробывали запустить релиз сборку?
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.06.2014, 08:23
Цитата Сообщение от Ilot Посмотреть сообщение
как видно у вас кидает исключение отладчик, т.е. среда. Как я и говорил.
Отладчику можно? Не обращать внимания? Или о чём речть?
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
24.06.2014, 08:28
Цитата Сообщение от alsav22 Посмотреть сообщение
Или о чём речть?
Цитата Сообщение от Ilot Посмотреть сообщение
Антон219, посмотрите в своей реализации кто может кидать такое исключение.
Я уже писал о том, что подобное поведение не является стандартом, а определяется реализацией и ваш пример вместе с моим собственно и подтвердил эти слова.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.06.2014, 08:34
Понятно.
1
1 / 1 / 0
Регистрация: 02.08.2022
Сообщений: 12
05.08.2022, 14:27
#include <iostream>
#include <vector>
using namespace std;

int main() {
int n, c = 0;
cin >> n;
vector <int> a;

//ввод
cin >> a[0];
for (int i = 1; i < n; i++) {

if (a[i] > a[i-1]){ c++; }
cin >> a[i];
}

cout << c;

return 0;
}
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
05.08.2022, 15:34
Ilya_2009, и чё? Ну говнокод, ну бывает. Зачем он в теме про Vector subscript out of range? Тем более в такой старой теме.
0
05.08.2022, 16:03

Не по теме:

Kuzia domovenok, наверное отрабатывает гроши что заплатили ранее.
Потому как сейчас нет смысла троллить на забытом задворке старого сарая.. Но оно все равно продолжает.
Се ля ви.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.08.2022, 16:03
Помогаю со студенческими работами здесь

Vector subscript out of range
Доброе утро, прочитал статью про векторы и решил создать один из них, однако при выводе он выдаёт ошибку: &quot;Vector subscript out of...

Vector subscript out of range
Не понимаю что происходит, объясните пожалуста #include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;vector&gt; #include...

Vector subscript out of range
Помогите пожалуйста, выводит такую ошибку , не пойму почему #include&lt;iostream&gt; #include&lt;vector&gt; #include&lt;stdio.h&gt; ...

Ошибка vector subscript out of range
Всем корректного. Читаю Страуструпа. В конце главы есть задание: в первый вектор вводятся люди(их имена), попарно. Во второй вводятся их...

expression vector subscript out of range
Появляется ошибка при компиляции expression vector subscript out of range.Нужна помощь. Сортировка слиянием.Пользовался информацией с...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru