Форум программистов, компьютерный форум CyberForum.ru

String subscript out of range при создании динамического массива - C++

Восстановить пароль Регистрация
 
antonid
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 22
14.12.2013, 21:56     String subscript out of range при создании динамического массива #1
Всем привет. Пишу игру на c++. Смысл состоит в том чтобы отстреливать группы врагов, которые появляются сразу после уничтожения предыдущей и в большем количестве. Застрял я на реализации появления новых групп.
Пытаюсь реализовать так(часть кода в которой ошибка):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <SFML/Graphics.hpp>/*Графическая библиотека SFML*/
#include <iostream>
int lvl = 0, en_kol = 0; /*уровень, кол-во врагов*/
int main(){
Enemy *en = new Enemy[1];/* первый раз создается массив класса enemy*/
    while (window.isOpen())
    {
    
    if(en_kol == 0){
        delete [] en; /*чистим память*/
            lvl++;/*уровень повышается*/
            en_kol = lvl*2;
            Enemy *en = new Enemy[en_kol];/*создаем новый массив и действуем дальше с ним*/
        
    }
}
system("pause");
return 0;
}
Программа вылетает при убийстве первой группы с ошибкой "string subscript out of range", однако если убрать
C++
1
lvl++;
, то все нормально работает.
Вопрос: как это исправить или как по другому реализовать появление новых групп?
PS: В такой программе все работает.
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
#include <iostream>
using namespace std;
class A{
public:
    int g;
    A(){
        cout<<"object has been created"<<endl;
    }
        ~A(){
        cout<<"object has been deleted"<<endl;
    
    }
};
int main(){
    int size = 10;
A *p = new A[size];
for (int i = 0;i<100;i++){
delete [] p;
p = NULL;
size++;
A *p = new A[size];
}
    system("pause");
return 0;
}
PPS: Я в c++ новичок, поэтому просьба не смеяться с моих методов =)

Добавлено через 2 часа 47 минут
Актуально.

Добавлено через 2 часа 16 минут
Все еще актуально.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2013, 21:56     String subscript out of range при создании динамического массива
Посмотрите здесь:

string subscript out of range C++
Ошибка String subscript out of range C++
C++ string subscript out of range Завтра лабу нужно здать! не понимаю где ошибка
ошибка string subscript out of range C++
string subscript out of range C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
14.12.2013, 22:08     String subscript out of range при создании динамического массива #2
antonid, вы при помощи постфиксного инкремента повышаете уровень. А затем количеству врагов присваиваете значение уровня, умноженного на два. Но уровень то всё равно остался нулевым. Либо используйте префиксный инкремент, либо инициализируйте уровень единицей.
antonid
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 22
14.12.2013, 23:12  [ТС]     String subscript out of range при создании динамического массива #3
Цитата Сообщение от StackOverflow Посмотреть сообщение
antonid, вы при помощи постфиксного инкремента повышаете уровень. А затем количеству врагов присваиваете значение уровня, умноженного на два. Но уровень то всё равно остался нулевым. Либо используйте префиксный инкремент, либо инициализируйте уровень единицей.
Спасибо за совет, но проблема не решилась. Я думаю тут какой-то косяк с выделением и освобождение памяти.
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
14.12.2013, 23:20     String subscript out of range при создании динамического массива #4
antonid, расскажите, пожалуйста, поподробней. Вот вы создали массив указателей на объекты класса Enemy, но никаких объектов не создали в приведённом выше коде. В вашем коде вы сознательно что-то убрали и копировали сюда какую-то проблемную часть кода или что? Зачем вы создали массив из указателей, и при этом никак его не используете, лично мне непонятно.
antonid
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 22
15.12.2013, 00:04  [ТС]     String subscript out of range при создании динамического массива #5
Цитата Сообщение от StackOverflow Посмотреть сообщение
antonid, расскажите, пожалуйста, поподробней. Вот вы создали массив указателей на объекты класса Enemy, но никаких объектов не создали в приведённом выше коде. В вашем коде вы сознательно что-то убрали и копировали сюда какую-то проблемную часть кода или что? Зачем вы создали массив из указателей, и при этом никак его не используете, лично мне непонятно.
Да, я написал только проблемную часть кода. Они используются при обработке столкновений врагов со стенами и пулями, и при проверке жив враг или нет. И естественно на них накладывается текстура и рисует указатель как врага.
Я не стал писать весь код, т.к. он большой.
Кстати на счет объектов. Я не создаю объекты отдельно, я работаю только с указателями. Просто я не до конца понимаю указатели и возможно что-то делаю в корне неправильно.
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
15.12.2013, 00:16     String subscript out of range при создании динамического массива #6
Цитата Сообщение от antonid Посмотреть сообщение
Кстати на счет объектов. Я не создаю объекты отдельно, я работаю только с указателями. Просто я не до конца понимаю указатели и возможно что-то делаю в корне неправильно.
Работаете с указателями, которые ни на что не указывают? Интересно. Указатель - идентификатор, по имени которого можно обратиться к некоторой ячейке в памяти, которая в свою очередь хранит адрес другой ячейки.
antonid
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 22
15.12.2013, 00:42  [ТС]     String subscript out of range при создании динамического массива #7
StackOverflow, На сколько я знаю, динамический массив можно создать только таким образом, и во всех примерах он не на что не ссылается. Я, если честно, не знаю почему это работает. Однако проблему я до сих пор не решил =(
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
15.12.2013, 01:28     String subscript out of range при создании динамического массива #8
antonid, не зря ведь в народе говорят: "век живи - век учись!". Сам убедился. Ну чтож, вообще, было бы неплохо на всю функцию main() сперва глянуть. Может быть, ошибка вовсе и не здесь спряталась. Ну и вдобавок можете попытаться en присвоить NULL для пущей уверенности, что дело не в этом.
antonid
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 22
15.12.2013, 20:38  [ТС]     String subscript out of range при создании динамического массива #9
StackOverflow, вот все что связано с врагами в функции main. (все переменные, функции и объекты были объявлены, но я это стер)

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
int main()
{   
 
    sf::RenderWindow window(sf::VideoMode(1200,860), "RPG game"); /*создаем окно*/
        Clock clock;
            std::srand(time(NULL));
            mx = player.sprite.getPosition().x;
            my = player.sprite.getPosition().y;
            //** Пустой массив врагов
                        Enemy *en = NULL;
             en = new Enemy[en_kol];
    while (window.isOpen())/*пока открыто окно эта функция выполняется постоянно*/
    {
    
    if(en_kol == 0){
    delete [] en;
            ++lvl;
            en_kol = lvl*2;
                 en = new Enemy[en_kol];
            for (int i = 0;i<en_kol;i++){ /*это вместо конструктора*/
                en[i].rect = sf::FloatRect(600+(i+1)*100, 300+(i+1)*30, 60, 60); /*координаты*/
                    en[i].sprite.setTexture(t); /*задается текстура*/
                                en[i].hp=en[i].mp = 100;
                                                    en[i].speed = 0.005;
                                                    en[i].live = 1; /*жив враг или нет*/
            }
    }
        float time =clock.getElapsedTime().asMicroseconds(); /* скорость игры*/
                    clock.restart();    
                    time = time*1.5;
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
            }
        }
        for (int i = 0;i<en_kol;i++){  /*столкновение со стрелой*/
            if (arrow.rect.top>en[i].rect.top-30 && arrow.rect.top< en[i].rect.top+30 && arrow.rect.left> en[i].rect.left-30 &&  arrow.rect.left< en[i].rect.left+30){
            arrow.fly = 0; /*указываем что стрела перестает лететь и исчезает за предел экрана*/
            arrow.rect.left = -800;
            arrow.rect.top = -800;
            en[i].hp -= 20;
            std::cout<<en_kol<<std::endl;
        } /* и с копьем*/
            if (spear.rect.top>en[i].rect.top-30 && spear.rect.top< en[i].rect.top+30 && spear.rect.left> en[i].rect.left-30 &&  spear.rect.left< en[i].rect.left+30 ){
            spear.fly = 0; /*указываем что копье перестает лететь и исчезает за предел экрана*/
            spear.rect.left = -800;
            spear.rect.top = -800;
            en[i].hp -= 50;     
            std::cout<<en_kol<<std::endl;
        }
                        if (en[i].hp<=0){    
                            en[i].checklive(); /*если враг умер при попадании, то он прячется за предел экрана и кол-во уменьшается на 1 (сказано в функции)*/
            }
        }
 
    for(int i = 0;i<en_kol;i++){
                                en[i].update(time,player.rect.left,player.rect.top); /*тут функции врага(движение, повороты, столкновения со стенами*/
    }
                            
        window.clear(sf::Color::Green);  /*чистим окно и рисуем все текстуры*/
        
        window.draw(cross.sprite);
        window.draw(player.sprite);
        if (en_kol !=0 ){
            for(int i = 0;i<en_kol;i++){
                window.draw(en[i].sprite);
            }
        }
        window.display();
    }
      return 0;
    system("pause");
    }
Добавлено через 2 часа 20 минут
Все еще актуально.

Добавлено через 2 часа 8 минут
Актуально

Добавлено через 5 часов 29 минут
Можно ли вообще так освобождать и выделять память?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.12.2013, 22:27     String subscript out of range при создании динамического массива #10
Среда какая? Отладчиком умеете пользоваться?

Добавлено через 5 минут
lvl, перед первым инкрементом, инициализирован?

Добавлено через 2 минуты
Цитата Сообщение от antonid Посмотреть сообщение
String subscript out of range
Сообщение о какой-то строке. Где у вас строки?

Добавлено через 58 секунд
Enemy, что из себя представляет?
antonid
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 22
15.12.2013, 22:47  [ТС]     String subscript out of range при создании динамического массива #11
Добавлено через 8 минут
Visualsav22, Visual 2010. Отладчик указывает на файл stdthrow.cpp
Все переменные инициализированы.
Строк нет, думаю память выходит за пределы массива en.
Enemy - класс, содержит координаты, хп, мп, функции движения, вращения, столкновений и определения жив объект или нет.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.12.2013, 22:54     String subscript out of range при создании динамического массива #12
Цитата Сообщение от antonid Посмотреть сообщение
Отладчик указывает на файл stdthrow.cpp
Цитата Сообщение от antonid Посмотреть сообщение
думаю память выходит за пределы массива en.
Думать, конечно, хорошо, но нужно взять отладчик и утановить точное место вашего кода, где вылет происходит.

Добавлено через 2 минуты
Сначала без захода в конструкторы и пр. Потом с заходом. Не зря же пишет компилятор о String. Может где и есть они.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2013, 23:11     String subscript out of range при создании динамического массива
Еще ссылки по теме:

пожалуйста исправте ошибку string subscript out of range C++
C++ Тип string и subscript out of range
C++ String subscript out of range

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

Или воспользуйтесь поиском по форуму:
antonid
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 22
15.12.2013, 23:11  [ТС]     String subscript out of range при создании динамического массива #13
alsav22, В точку. Просто при создании большого кол-ва врагов они выходили за пределы массива карты, что в функции столкновений недопустимо. Спасибо, навели на мысль =)
Yandex
Объявления
15.12.2013, 23:11     String subscript out of range при создании динамического массива
Ответ Создать тему
Опции темы

Текущее время: 04:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru