FlyOfFly
А фиг знает
memset(tiles, 0, SizeMapZ * SizeMap* SizeMap * sizeof( Tile));
крашится в этом месте
war_zes
А тупо пустая инициализация не работает?
tiles[SizeMapZ][SizeMap][SizeMap] = { };
war_zes
> sizeof(Tile)
sizeof(Tile*) должно быть, судя по объявлению массива.
FlyOfFly
> А тупо пустая инициализация не работает?
Там массив сильно большой - студия не осиливает (время компиляции долгое, а если еще добавить - то ошибка кучи в студии)
0xBADCODE
> Мне приходилось заводить отдельную переменную для учета реально хранящегося в
> std::array числа элементов, хотя до знакомства с ним я полагал, что можно будет
> просто воспользоваться push_back() и size().
совет: начни учить язык или не пиши подобный бред больше.
war_zes
> Не работает - какой-то элемент не обнуляется (вылетает по 0xFFFFFFF - что в
> дебаге как признак что элемент не занулен)
и смысл тебе массив указателей, потом будешь под каждый выделять отдельно память? У тебя от Tile что-то наследуется? Или ты собираешься их как-то сортировать, перемещать? Если нет, выделяй сразу одним куском. Что касается обнуления:
memset(tiles, 0, sizeof( Tile*) * SizeMapZ * SizeMap* SizeMap);
Aroch
> и смысл тебе массив указателей
Чтобы в памяти занимало 20мб, а не 5гб))) (а это реальные числа, игрался тут с массивами - реально по 4-5 гб на тайлмапу улетало)
Больинство тайлов идентичны - 10500 тайлов стены - это все тот же блок с той же текстурой и теми же свойствами, так зачем делать 10500 копий, если можно один тайл стены, и 10500 указателей на него?
war_zes
> Чтобы в памяти занимало 20мб, а не 5гб)))
значит ты делаешь что-то не так.
> это все тот же блок с той же текстурой и теми же свойствами, так зачем делать
> 10500 копий
если у тебя тайлы хранят текстуру включая ее данные то ты делаешь что-то не так.
В общем и целом у тебя тайлы должны хранить набор ссылок/айдишников и какие-то специфичные им данные: цвет, всевозможные флаги и т.д. Набор же ссылок включают в себя ссылки на текстуру, события и может что-нибудь еще. Сами же текстуры и события храняться отдельно, тайлы лишь ссылаются на них. Размер такого тайла будет считанные байты, максимум доберется до килобайта если там совсем в жир уйти.
почему бы вместо memset не использовать std::fill?
CapSopener
> std::fill
std лучше не подключать в проект, даже ради std::move
CapSopener
> почему бы вместо memset не использовать std::fill?
std::fill для присвоения значения диапазону элементов, не для инициализации памяти.
memset специально оптимизирована для быстрой инициализации памяти.
Сравнительный тест: https://godbolt.org/z/fj3hr6MG9
totoro
а если с -O3? Да и не вектор в исходной задаче, а массив.
Цель - присвоить элементам массива конкретное значение, std::fill делает это независимо от типа и значения.
Понятное дело, нормальный программист и с помощью memset справился бы, но war_zes-у std::fill сэкономил бы время на отладку и избавил от унизительных вопросов на форуме.
Разреженные структуры данных еще не предлагали?
memset(tiles, 0, sizeof( tiles));
war_zes
> Там массив сильно большой
Тебе не кажется, что ты что-то неправильно делаешь а?
#!
> std лучше не подключать в проект, даже ради std::move
Еретические мысли лучше рассказывай на своей работе в своей секте. А здесь просили нормальное решение.