Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2013, 18:59   #1
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию Ошибка string subscript out of range

Код:
const int H = 12;
const int W = 36;
String TileMap[12] = 
{
	"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
	"B                           B       B",
	"B                          BB       B",
	"BBBB                        B       B",
	"BBBBBBBB      BBBBBBBB        BBBBBBB",
	"B                           B       B",
	"B                          BB       B",
	"BBBB                        B       B",
	"BBBBBBBB      BBBBBBBB        BBBBBBB",
	"B                           B       B",
	"B                          BB       B",
	"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
Масив строк - карта, в окне символ "В" заменяется графической фигурой, в даном случие - квадратом размером 32х32.

По карте двигается игрок. Сейчас это картинка разером 32х32.
Вот функции обработки столкновений игрока с квадратами(литера "В").

Код:
//dx,dy скорость
void CollisionX()
	{

		for (int i=rect.top/32; i<(rect.top+rect.height)/32; i++)
		{
			for (int j = rect.left/32; j<(rect.left+rect.width)/32; j++)

				if (TileMap[i][j] == 'B' && j<W && i<H)
				{
					if (dx>0) rect.left = j*32 - rect.width;
					if(dx<0) rect.left = j*32 +32;
				}
		}
	}

	void CollisionY()
	{
		for (int i=rect.top/32; i<(rect.top+rect.height)/32; i++)
		{
			for (int j = rect.left/32; j<(rect.left+rect.width)/32; j++)
				if (TileMap[i][j] == 'B')
				{
					if (dy>0)
						rect.top = i*32 - rect.height;
					if(dy<0) 
						rect.top = i*32 +32;
				}

		}
	}

//а здесь update

void update (float time)
	{
		
		rect.left += dx*time;

		rect.top += dy*time;

		CollisionX();
		CollisionY();

sprite.setPosition(rect.left, rect.top);

		dx = 0;
		dy = 0;
	}
а здесь игровой цыкл:
Код:

while (window.isOpen())
	{ 
		float  time = clock.getElapsedTime().asMicroseconds();

		clock.restart();
		Event event;
		while (window.pollEvent(event))
		{
			if (event.type == sf::Event::Closed)
				window.close();
		}

		if (Keyboard::isKeyPressed(Keyboard::Left))
		{

			p.dx = -0.001; 

			
		}
		if (Keyboard::isKeyPressed(Keyboard::Right))
		{
			p.dx = 0.001;
			

			

		}
		if (Keyboard::isKeyPressed(Keyboard::Up))
		{
			p.dy = -0.001;

			
		}
		if (Keyboard::isKeyPressed(Keyboard::Down))
		{
			p.dy = 0.001;

			
		}
		p.update(time);

		window.clear(Color::White);

		for (int i=0; i<H; i++)
			for (int j = 0; j<W; j++)
			{
				if (TileMap[i][j] == 'B')
				{
					rectangle.setFillColor(Color::Black);
					rectangle.setSize(Vector2f(32,32));
					rectangle.setPosition(32*j, 32*i);
					window.draw(rectangle);
				}
			}
		window.draw(p.sprite);
		window.display();
	}
Я не могу понять почему возникает эта ошибка. Надеюсь кто-нибудь поможет)
Изображения
Тип файла: png Capture.PNG (28.3 Кб, 170 просмотров)
Pein95 вне форума Ответить с цитированием
Старый 03.10.2013, 21:45   #2
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

где-то вы, при обращении к элементу, хранящемуся в string, вышли за пределы памяти, выделенной для string.
Т.е
Код:
string TileMap[12]
TileMap[13] = 'k'; // error!
Igor95 вне форума Ответить с цитированием
Старый 03.10.2013, 23:56   #3
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

нууу, это я знал))
Я не могу найти ошибку в коде)
Pein95 вне форума Ответить с цитированием
Старый 04.10.2013, 01:18   #4
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Так отладчиком пройдитесь, он вам и значение переменыных покажет и т.д.
Так же проще и эффективнее.

Вот такую строку проверьте
Код:
for (int j = rect.left/32; j<(rect.left+rect.width)/32; j++)
Igor95 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка runtime error '9' subscript out of range BioNoob Microsoft Office Excel 2 05.06.2012 16:33
Очередная ошибка Run-time error 9: subscript out of range klimusik Microsoft Office Excel 7 07.05.2012 00:08
Ошибка Run-time error '9' : Subscript out of range mad_moon Microsoft Office Excel 11 12.12.2011 23:37
Subscript out of range -в чем ошибка Bape}l{ka Microsoft Office Excel 4 14.11.2011 16:26
subscript out of range Bape}l{ka Microsoft Office Excel 2 31.10.2011 12:54