b_eat, внешний вид станции есть, но блоков нет? Любопытненько. Могу попробовать вам помочь. Юнити 2017.1 ещё не смотрел, но думаю, что там ничего принципиально нового нет...
Сообщение отредактировал Vuvk - Понедельник, 07 Августа 2017, 08:16
Думаю будет интересно как некомерческим школьникам
Ух, я прям напрягся. Честно, не понимаю как можно запрашивать какие-то суммы (весьма неплохие!) за неконкурентоспособный движок, который пилится на дому, когда существуют бесплатные движки с некстген графикой, физикой, сетью и тра-та-та. Но, так или иначе, пожелаю удачи, потому что движок писать - титанический труд. И поправьте хотя бы название темы
Цитата
Имперсeкий
Сообщение отредактировал Vuvk - Четверг, 03 Августа 2017, 21:45
Я просто сравнил нормальный выровненный вариант, который сотворил компилятор с вариантом, если выставить выравнивание в 1 байт.
Цитата
[a000 bbbb] vs [abbb b] - выделил позицию байта, если к b обратиться так же, как в первом варианте
Цитата
когда мне нужно выделить память под структуру размером 5 байт, то функция вернет адрес свободной зоны в которую структура может поместиться, в нашем случае - это 16, собственно после этого зона становится не свободной
и после этого оставшиеся 11 байт будут болтаться пустыми и бесхозными? Что-то как-то подозрительно. Пойду дальше учить мат.часть.
Цитата
Не на современных машинах, а компилятор их так представляет, с таким же успехом в другом яп нулевой указатель может быть предствлен в виде более сложной структуры.
Цитата
1.14: Ну а если честно, на какой-нибудь реальной машине используются ненулевые внутренние представления нулевых указателей или разные представления для указателей разных типов?
и в ответ какой-то раритет. А насчет других ЯП - бог с ними, я же о Си толкую.
Сообщение отредактировал Vuvk - Четверг, 03 Августа 2017, 11:55
в любом случае при обращении к s.a или s.b у тебя будет ссылаться на начало, где лежит эта переменная
так я с этим и не спорю, я говорю, что если бы, то. В общем я на свои два вопроса нашёл ответы: 1 на современных машинах нулевые указатели равны 0, так что можно их каллокать. 2 "также я натыкался на информацию, что malloc выравнивает данные, а calloc нет." - фигня.
Ну я думаю не совсем, malloc просто выделяет тебе непрерывный кусок памяти, сколько скажешь, столько и выделится, что делать с этой памятью дело уже твое
ЦитатаXakep ()
эти зоны уже выровненные и когда мне нужно выделить память под структуру размером 5 байт, то функция вернет адрес свободной зоны в которую структура может поместиться, в нашем случае - это 16
Если бы это было так, то запихав "сжатую" структуру в выровненные 8 байт, я бы при попытке доступа к b (поле в example_s) получал бы адрес последнего её байта вместо первого (смотри под спойлер "типа схема" здесь и в предыдущем моем посте)
type TExample = packed record a : Byte; b : Integer; end;
Берем и выясняем её размер: sizeof(example_s) = 5 байт
А так как, что в маллоке, что в каллоке я указываю размер структуры, а не количество байт, то о каком выравнивании в маллоке и отсутствии его же в каллоке может быть речь? Видимо дезинфо вычитал.
example_s *e = malloc(sizeof(example_s)); и example_s *e = calloc(1, sizeof(example_s)); printf("sizeof = %d\n", sizeof(*e)); дают одинаковые размеры
Сообщение отредактировал Vuvk - Среда, 02 Августа 2017, 14:40
Почему в разделе вопросов по Си вопросы и ответы не по теме? Непорядок!
Итак, новые дилетантские вопросы от Антона (меня, то есть). Как я уже отметил в отдельной теме, я пишу игровой движок на чистом Си и имитирую некоторые ООПшные подходы. Вместо классов у меня структуры и я всячески ими манипулирую. Ну так вот. После создания "класса" через malloc на выходе получалась забитая мусором структура и в "конструкторах" я затирал поля в 0. Потом я подумал, что всё это можно заменить одним простым calloc. А позже наткнулся на эту статью, которая подтверждала правильность решения:
Цитата
Никогда не используйте malloc Привыкайте к calloc. С этой функцией вам не грозит снижение производительности при очистке памяти.
Но также я натыкался на информацию, что malloc выравнивает данные, а calloc нет. И у меня теперь есть некоторые сомнения. На проверяемых компуктерах всё работает исправно, но могут ли быть проблемы на каком-то другом железе или времена процессоров, не умеющих работать с невыравненными значениями, канули в Лету? Теперь второй вопрос. О нулевых указателях - NULL. NULL определен как (void*)0. Это не математический 0, он преобразуется компилятором в указатель на какую-то область памяти, которая на разных платформах - разная. (Читал в какой-то книге в форме вопрос-ответ по Си. Не могу найти, но ссылку предоставлю позднее). Итак сам вопрос. Вот у меня есть структуры, в которых есть указатели. Я создаю их через calloc(1, sizeof(any_struct)), то в указатель попадёт 0. Но ведь 0 попадёт "математический" и в момент исполнения программы. Как быть уверенным, что этот 0 будет нулевым указателем? Или не будет? Опять же вроде работает, но вдруг на каких-то машинах это работать не будет? Вот такие вопросы новичка. (начал изучение Си пару месяцев назад, не пинайте, судари)
Добавлено (02 августа 2017, 05:54) --------------------------------------------- По поводу моего второго вопроса, видимо, на современных компах можно не париться. Я вчера не мог найти, откуда я взял инфу про путаницу с нулевыми указателями, но сегодня нашёл:
Цитата
Программист, который хочет явно различать 0 как целое и 0 как нулевой указатель может использовать NULL в тех местах, где необходим нулевой указатель. Это только стилистическое соглашение; препроцессор преобразует NULL опять в 0, который затем распознается компилятором в соответствующем контексте как нулевой указатель.
Цитата
1.11: Почему так много путаницы связано с нулевыми указателями? Почему так часто возникают вопросы? О: Программисты на С традиционно хотят знать больше, чем это необходимо для программирования, о внутреннем представлении кода. Тот факт, что внутреннее представление нулевых указателей для большинства машин совпадает с их представлением в исходном тексте, т.е. нулем, способствует появлению неверных обобщений.
Цитата
1.14: Ну а если честно, на какой-нибудь реальной машине используются ненулевые внутренние представления нулевых указателей или разные представления для указателей разных типов?
О: Серия Prime 50 использует сегмент 07777, смещение 0 для нулевого указателя, по крайней мере, для PL/I. Более поздние модели используют сегмент 0, смещение 0 для нулевых указателей С, что делает необходимыми новые инструкции, такие как TCNP (проверить нулевой указатель С), которые вводятся для совместимости с уцелевшими скверно написанными С программами, основанными на неверных предположениях. Старые машины Prime с адресацией слов были печально знамениты тем, что указатели на байты (char *) у них были большего размера, чем указатели на слова (int *). Серия Eclipse MV корпорации Data General имеет три аппаратно поддерживаемых типа указателей (указатели на слово, байт и бит), два из которых — char * и void * используются компиляторами С. Указатель word * используется во всех других случаях. Некоторые центральные процессоры Honeywell-Bull используют код 06000 для внутреннего представления нулевых указателей. Серия CDC Cyber 180 использует 48-битные указатели, состоящие из кольца (ring), сегмента и смещения. Большинство пользователей (в кольце 11) имеют в качестве нулевых указателей код 0xB00000000000. Символическая Лисп-машина с теговой архитектурой даже не имеет общеупотребительных указателей; она использует пару <NIL,0> (вообще говоря, несуществующий <объект, смещение> хендл) как нулевой указатель С. В зависимости от модели памяти, процессоры 80*86 (PC) могут использовать либо 16-битные указатели на данные и 32-битные указатели на функции, либо, наоборот, 32-битные указатели на данные и 16-битные — на функции. Старые модели HP 3000 используют различные схемы адресации для байтов и для слов. Указатели на char и на void, имеют, следовательно, другое представление, чем указатели на int (на структуры и т.п.), даже если адрес одинаков.
Сообщение отредактировал Vuvk - Вторник, 01 Августа 2017, 20:25
Не делать сайт, сервера и прочую ненужную и пафосную хрень, котрая на начальном этапе только отнимает время и ресурсы. А тупо взять и сделать простейшую игру.
Тебе нужно 6 ячеек, в котором бы было 32 значения? Так возьми двухмерный массив mass [32, 6] и не пудри мозги! Можно запаковать в одномерный, но зачем тебе это?
Операция умножения медленная, так что первый вариант будет чуть шустрее. Плюс ты во втором варианте в цикле объявляешь переменную в каждой итерации, что тоже плохо.
Добавлено (31 июля 2017, 21:47) --------------------------------------------- Я чего-то не понимаю? У тебя получится одномерный массив в обоих случаях вида 0_31 элемент мусора_0_31 элемент мусора_0_31 элемент мусора_0_31 элемент мусора_0_31 элемент мусора_0
Сообщение отредактировал Vuvk - Понедельник, 31 Июля 2017, 21:42
Хочу только каких-то уточнений. В приведенном в пример Uncharted подозреваю, что анимация MotionCapture+facial motion capture. Поправьте, если это не так. Ты говоришь, что скелетная анимация - это геморрой. А мне вот кажется, что в точности до наоборот. Особенно в 3D. Взять старые форматы с покадровой анимацией морфингом для игр Quake1-3 (mdl, md2, md3). Вот где геммор-то был! В каждом кадре дёргать отдельные вершины!
Как и в любой деятельности: 1. поиск теоретической базы, усвоение (книги, статьи). 2. практика. 3. возврат к пункту 1. 4. практика с применением новых знаний. рекурсия
Если упёрся в потолок, то попробовать другие техники/стили. Сужу тоже, как программист.
И, как заметил BrightSpot, практика на реальных задачах предпочтительней.
Сообщение отредактировал Vuvk - Воскресенье, 30 Июля 2017, 19:55
Saitei, задача не только быстро искать, но и быстро добавлять/удалять элементы. Так что массив не катит. giperion, если что-то можно сделать надежнее/быстрее, то почему бы и нет.
Gudleifr'a на Вас нет
Сообщение отредактировал Vuvk - Воскресенье, 30 Июля 2017, 17:48