Начну сразу без всяких предисловий:
void World::InitializeChunkManager() { ChunksToLoad = new ChunkLoaderData[CHUNKS_PER_SIDE * CHUNKS_PER_SIDE]; for( int i = 0; i < CHUNKS_PER_SIDE * CHUNKS_PER_SIDE; ++i) ChunksToLoad->free = true; }
Видно, то поле free выставится в true только для первого элемента. Debug и Release сборки обе выставляют true для всех полей, если запустить из студии по F5. Запускаю экзешник, вижу, ессно, что поле true выставлено только у первого. Почему так? Если запустить из студии приложение, то я этой ошибки и не замечу (по невнимательности допустил).
ArchiDevil
> ChunksToLoad->free = true;
ChunksToLoad[i].free = true;
и будет щасте.
Sbtrn. Devil
Я это знаю, я уже исправил. Дело в том, что я эту багу искал несколько часов. В студии-то всё правильно запускается.
Проблема-то, не решена. Почему студия запускает что-то другое мне, а не скомпилированный экзешник?
Хм - ChunksToLoad - указатель на первый элемент массива - поэтому операция -> прокатила. На счет разницы из студии и самозапуск - это конечно загадка.
ArchiDevil
> Почему студия запускает что-то другое мне, а не скомпилированный экзешник?
Потому что запускаешь из под отладчика.
NIXIUS
> Хм - ChunksToLoad - указатель на первый элемент массива - поэтому операция ->
> прокатила.
Да, но по коду, я много раз, выходит, делаю присваивание полю первого элемента в массиве значение "истина". Оно так, если я запускаю уже скомпилированный экзешник. Если запустить из студии, то я получу, что поле free у ВСЕХ элементов будет true. Почему так? Это неверно.
Ghost2
> Потому что запускаешь из под отладчика.
И чудесным образом там оказывается то, что я хочу увидеть?) Есть еще одна мистическая хрень - чанки мира заполняются, исходя из соседних. Если в соседних мусор, или они не загружены, то всё заполнится неверно. И вот опять тоже самое - из под студии я получаю идеальную сетку, всё без единой ошибочки. А запуская экзешник, я получаю, как и следовало ожидать, кривую сетку. Как тут ошибки искать, если всё работает непонятным образом?
ArchiDevil
> Как тут ошибки искать
Ищи тулзу, обнаруживающую использование неинициализированных переменных.
В дебаге ничего не падает, т.к. все переменные инициализируются некоторыми значениямиp, отличными от 0/false. В релизе ничего этого не делается, поэтому в переменных мусор и поведение неопределено.
RPGman
> Ищи тулзу, обнаруживающую использование неинициализированных переменных.
Студия не умеет? Может быть там какая-нибудь настройка, или что-то подобное?
RPGman
> В дебаге ничего не падает, т.к. все переменные инициализируются некоторыми
> значениямиp, отличными от 0/false.
Так а у меня не падает) И про инициализацию в дебаге я знаю, из-за этого с большими массивами он медленно ворочается.
RPGman
> В релизе ничего этого не делается, поэтому в переменных мусор и поведение
> неопределено.
У меня как раз трабла необычная - в релизе "по F5" всё великолепно, поведение отличное (хотя по коду не должно быть). Ошибок ни с сеткой, ни с тем, что в первом посте, вообще нет. Как студия догадывается, что я хочу увидеть? Телепатия?
> Телепатия?
Частные проявления UB.
RPGman
> Ищи тулзу, обнаруживающую использование неинициализированных переменных.
это как минимум Warning.
кажется в С++ есть что то подобное на счет не инициализированных указателей, может и с переменными тоже самое делается, они просто заполненны 0xFEEEFEEE или 0xDDDDDDDD.
пишите убийцу майнкрафта и/или редактор ресурсов к онному?)
cheprogrammer
Убивцу, убивцу.
ArchiDevil
> У меня как раз трабла необычная - в релизе "по F5" всё великолепно, поведение
> отличное (хотя по коду не должно быть). Ошибок ни с сеткой, ни с тем, что в
> первом посте, вообще нет. Как студия догадывается, что я хочу увидеть?
> Телепатия?
Переключи в hexademical view. Что у тебя в булевских переменных? 1, 0xcdcd или мусор?
И конструктор ChunkLoaderData еще бы.
PS. Чудес не бывает :)
Тема в архиве.