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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
antonid
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 22
#1

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

14.12.2013, 21:56. Просмотров 582. Ответов 12
Метки нет (Все метки)

Всем привет. Пишу игру на 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 минут
Все еще актуально.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2013, 21:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос String subscript out of range при создании динамического массива (C++):

String subscript out of range - C++
Разбираю пример, который дала препод в примерах к лекциям..Пример по коду Виженера.. Пару раз запустился-результат выводился.Исправила...

String subscript out of range - C++
При запуске выдает ошибку &quot;string subscript out of range&quot;. Подскажите, в чем проблема. #include &lt;iostream&gt; #include &lt;string&gt; ...

Ошибка при быстрой сортировке файла: "string subscript out of range" - C++
В файле input.txt содержатся сведения о группе студентов в формате: номер группы; запись о каждом студенте группы содержит следующие...

Ошибка: string subscript out of range - C++
При запуске выдает ошибку &quot;string subscript out of range&quot;. Подскажите, в чем проблема. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

Ошибка: String subscript out of range - C++
Expression: String subscript out of range Консольное приложение. Программа должна перерабатывать построчно текстовый файл с кодом и...

Тип string и subscript out of range - C++
Доброго времени дня. Такая проблема. Обращаюсь к отдельному элементу массива: #include &lt;iostream&gt; #include &lt;string&gt; ...

12
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
14.12.2013, 22:08 #2
antonid, вы при помощи постфиксного инкремента повышаете уровень. А затем количеству врагов присваиваете значение уровня, умноженного на два. Но уровень то всё равно остался нулевым. Либо используйте префиксный инкремент, либо инициализируйте уровень единицей.
1
antonid
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 22
14.12.2013, 23:12  [ТС] #3
Цитата Сообщение от StackOverflow Посмотреть сообщение
antonid, вы при помощи постфиксного инкремента повышаете уровень. А затем количеству врагов присваиваете значение уровня, умноженного на два. Но уровень то всё равно остался нулевым. Либо используйте префиксный инкремент, либо инициализируйте уровень единицей.
Спасибо за совет, но проблема не решилась. Я думаю тут какой-то косяк с выделением и освобождение памяти.
0
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
14.12.2013, 23:20 #4
antonid, расскажите, пожалуйста, поподробней. Вот вы создали массив указателей на объекты класса Enemy, но никаких объектов не создали в приведённом выше коде. В вашем коде вы сознательно что-то убрали и копировали сюда какую-то проблемную часть кода или что? Зачем вы создали массив из указателей, и при этом никак его не используете, лично мне непонятно.
0
antonid
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 22
15.12.2013, 00:04  [ТС] #5
Цитата Сообщение от StackOverflow Посмотреть сообщение
antonid, расскажите, пожалуйста, поподробней. Вот вы создали массив указателей на объекты класса Enemy, но никаких объектов не создали в приведённом выше коде. В вашем коде вы сознательно что-то убрали и копировали сюда какую-то проблемную часть кода или что? Зачем вы создали массив из указателей, и при этом никак его не используете, лично мне непонятно.
Да, я написал только проблемную часть кода. Они используются при обработке столкновений врагов со стенами и пулями, и при проверке жив враг или нет. И естественно на них накладывается текстура и рисует указатель как врага.
Я не стал писать весь код, т.к. он большой.
Кстати на счет объектов. Я не создаю объекты отдельно, я работаю только с указателями. Просто я не до конца понимаю указатели и возможно что-то делаю в корне неправильно.
0
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
15.12.2013, 00:16 #6
Цитата Сообщение от antonid Посмотреть сообщение
Кстати на счет объектов. Я не создаю объекты отдельно, я работаю только с указателями. Просто я не до конца понимаю указатели и возможно что-то делаю в корне неправильно.
Работаете с указателями, которые ни на что не указывают? Интересно. Указатель - идентификатор, по имени которого можно обратиться к некоторой ячейке в памяти, которая в свою очередь хранит адрес другой ячейки.
0
antonid
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 22
15.12.2013, 00:42  [ТС] #7
StackOverflow, На сколько я знаю, динамический массив можно создать только таким образом, и во всех примерах он не на что не ссылается. Я, если честно, не знаю почему это работает. Однако проблему я до сих пор не решил =(
0
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
15.12.2013, 01:28 #8
antonid, не зря ведь в народе говорят: "век живи - век учись!". Сам убедился. Ну чтож, вообще, было бы неплохо на всю функцию main() сперва глянуть. Может быть, ошибка вовсе и не здесь спряталась. Ну и вдобавок можете попытаться en присвоить NULL для пущей уверенности, что дело не в этом.
0
antonid
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 22
15.12.2013, 20:38  [ТС] #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 минут
Можно ли вообще так освобождать и выделять память?
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.12.2013, 22:27 #10
Среда какая? Отладчиком умеете пользоваться?

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

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

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

Добавлено через 2 минуты
Сначала без захода в конструкторы и пр. Потом с заходом. Не зря же пишет компилятор о String. Может где и есть они.
1
antonid
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 22
15.12.2013, 23:11  [ТС] #13
alsav22, В точку. Просто при создании большого кол-ва врагов они выходили за пределы массива карты, что в функции столкновений недопустимо. Спасибо, навели на мысль =)
0
15.12.2013, 23:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2013, 23:11
Привет! Вот еще темы с ответами:

Ошибка String subscript out of range - C++
Здравствуйте. Написал на Dev C++ 4.9.9.2 программу которая открывает фаил и кладет все в буфер. Содержание файла: gehen v test*kommen v...

Ошибка string subscript out of range - C++
Здраствуйте создал библиотеку, при подключение библиотеки и запуска программи все работает коректно(данние принимаются, обрабативаются,...

Исправьте ошибку string subscript out of range - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; using namespace std; int main () { string s = &quot;222/2&quot;; ...

и вновь я к вам - string subscript out of range - C++
Смысл того, что делаю, в принципе по комментам кода должно быть понятно - частотный анализ текста. На 38 строке выбивает string subscript...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru