«Гопник-2»: убрал printf
Закончил убирать функцию printf, сегодня вколотил последний гвоздь в крышку её гроба. Я
В процессе замены встретилось вот такое. Загадка, всё ли хорошо в следующем коде?
std::cout << fmt::format(" {}(+{})", main_hero->inv[i].name, main_hero->inv[i].armo)Мой компилятор считает, что всё, но сборка на «Гитхабе» падает с ошибкой «Binding packed field error».
Получается, я по неведомой причине не могу обратиться по ссылке на поле внутри упакованной структуры (fmt::format принимает параметры по ссылке).
Структуру я пакую, чтобы нивелировать различия на бинарном уровне между компиляторами, — так как я её сохраняю и восстанавливаю как есть. В общем, от упаковки не отказаться, пришлось присвоить значения промежуточным переменным:
const auto name = main_hero->inv[i].name;
const auto armo = main_hero->inv[i].armo;
std::cout << fmt::format(" {}(+{})", name, armo);Выглядит, как костыль, но самое главное — почему один компилятор требует промежуточные переменные, а другой умеет и без них?
Я бы понял, если бы «Гитхаб» собирал мне бинарники
Комментарии 2
Думаю, это https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36566.
Вообще, использовать упакованные структуры таким образом — не очень хорошая идея. Да, fmt::format() должен работать, но:
Лучше бы использовать для хранения данных
Microsoft, кстати, в своё время налетел на эту проблему со своим форматом .doc. У них был формат файла, хранящий данные в таких вот структурах, а потом хренак, и появилась платформа x64.
Ссылка про это, да, но я не нашёл там хорошего объяснения.
Согласен, но это текстовый квест, у него ровно никаких проблем с производительноусть.
Безусловно, но я ведь игру не сам писал, она мне досталось, моя задача была её максимально быстро починить. Сначала я подумал, что было бы неплохо сохранять структуру, которой не хватает для работы сохранения и восстановления целиком — это было максимально дёшево с точки зрения программирования, потом стал героически преодолевать трудности, которые из этого произошли.
Да, мы с одним из контрибьюторов о том же ночью переписывались. Есть ещё мысль перейти на //sqlite//.
А какиначе-то было в те времена делать? Всё экономили, ресурсов мало было, другого пути просто не было. Кстати, никогда не слышал, что у них были какие-то сложности с форматом //doc// на 64 битах.