Дядя Миша писал: Нигде, естественно. Это одна из тех идиотских задачек, которые любят задавать на собеседованиях.
Тогда почему просто ошибку не вывести?
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Ну чтож, насколько я могу судить, источником UB служит только и исключительно префиксный инкремент\декремент. Всё остальное детерминировано.
Добавлено 03-12-2022 в 16:07:
Итак, товарищи, я опять со своими глупостями. Поскольку компиляторы не жрут выражения вида ++i++ мы упростим себе задачку и оставим только четыре комбинации из префиксных и постфиксных выражений.
Выглядит это вот так:
code:
int main()
{
{
int i = 0;
int j = ++i + ++i;
printf( "%i = ++i + ++i; %i = i;\n", j, i );
}
{
int i = 0;
int j = i++ + i++;
printf( "%i = i++ + i++; %i = i;\n", j, i );
}
{
int i = 0;
int j = ++i + i++;
printf( "%i = ++i + i++; %i = i;\n", j, i );
}
{
int i = 0;
int j = i++ + ++i;
printf( "%i = i++ + ++i; %i = i;\n", j, i );
}
return 0;
}
С точки зрения юзера (то есть меня), порядок выполнения во всех случаях должен быть следующим:
C++ Source Code:
inc( a );
inc( b );
c = a + b;
Однако инкременты напрямую влияют на процесс парсинга выражений, из-за чего там всё может меняться местами в случайном порядке. Это поведение происходит из-за того, что компиляторы С\С++ в сущности ведут себя подобно ассмеблеру - что читаю, тут же генерирую код.
Ну поумнее конечно чем транслятор ассемблера, но вот такие фокусы там никак не обрабатываются. Ваша задачка засунуть эти примеры UB в разные студии и скинуть сюда результаты выполнения.
Подам пример:
HeadShot v 0.43
C++ Source Code:
1
4 = ++i + ++i; 2 = i;
2
4 = i++ + i++; 2 = i;
3
4 = ++i + i++; 2 = i;
4
4 = i++ + ++i; 2 = i;
MSVC 6.0
C++ Source Code:
1
4 = ++i + ++i; 2 = i;
2
0 = i++ + i++; 2 = i;
3
2 = ++i + i++; 2 = i;
4
2 = i++ + ++i; 2 = i;
Здесь как видите UB в полный рост. Интересно будет сравнить результаты с более свежими студиями.
Если между шестёркой и 19-й студией отличий нет, думаю во всей линейке микрософтовских компиляторов их и не будет. Но всякие там GCC любопытно было бы взглянуть, да.
Вот ещё какая шляпа выяснилась. Я над этим не задумывался просто потому, что оно мне было не нужно. Дело в том, что new для массива возможен только с дефолтным конструктором. Нельзя написать что-то типа
C++ Source Code:
new foo( 1 )[100];
Ну то есть может оно и можно, но шестёрка не даёт этого сделать.
Причём сам массив работает как для классов, так и для POD-типов, но кастомный конструктор тут вызвать нельзя. Впрочем у меня наверное вообще не будет этой возможности, т.к. она вступает в серъезные противоречия с концепцией всей виртуальной машины. Ну или если быть точным - это же придётся городить какую-то отдельную структуру, которая во первых будет разом высвобождать всё, а во вторых её надо где-то хранить и оберегать от попыток высвободить память через free, например.
Добавлено 04-12-2022 в 15:52:
ЗЫ. Эта штука вообще походу какой-то костыль, потому что, например нельзя написать вот так
C++ Source Code:
new foo[100][100];
Т.е. многомерный массив таким образом тоже не сделать. Впрочем его обычно используют для выделения массива POD-типов или АТД-типов.
Чего-то такого без виртуальных деструкторов. Во избежание.
Можно будет обращаться к скрипту как компоненту энтитии? Например на объекте висит скрипт вызывающий класс Ригидбоди. Каким образом к нему обратиться у тебя?
Как можно будет задать объектам и физике слои, чтобы одни могли видеть друг друга, а другие нет?
Куда завернуты материалы с шейдерами? Как с ними общаться через скрипт?
Возможно будет сделать выполнение скрипта прямо в редакторе?
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Я в этой схеме вообще не вижу клиент-серверной архитектуры, поэтому такого порядка событий у меня и не будет. Да и вообще тут странно приоритеты расставленны.
Цитата:
FiEctro писал: Можно будет обращаться к скрипту как компоненту энтитии?
Не совсем. Предполагается на что на скриптовом языке будет полностью написана вся игровая часть кода, как в Quake. Это самый удобный вариант.
Если же объекты существуют внутри движка, а взаимодтействие с ними идёт через различные скрипты, обязательно возникнут ситуации, которые не решаются и которые пообещают решить в новой версии. Я заведомо не хочу создавать такую ситуацию.
Цитата:
FiEctro писал: Например на объекте висит скрипт вызывающий класс Ригидбоди
Вот есть Half-Life SDK написанный на С++. А теперь представь что вместо С++ - мой скриптовой язык. Который специально точился под все эти игровые особенности и заморочки. То есть будут такие же библиотеки как для халфы с очень-очень похожим на С++ кодом. Но с кучей возможностей, нереализуемых на С++ безкостыльными методами.
Цитата:
FiEctro писал: Как можно будет задать объектам и физике слои, чтобы одни могли видеть друг друга, а другие нет?
Но в физике нет понятия "видеть". Должно быть ты имел в виду столкновения?
Цитата:
FiEctro писал: Куда завернуты материалы с шейдерами? Как с ними общаться через скрипт?
Через скрипт я думаю никак, да и навряд ли это понадобится. Вот из материала прочитать свойства объекта - это да, такая возможность будет. На мой взгляд это гораздо более оптимально.
Цитата:
FiEctro писал: Возможно будет сделать выполнение скрипта прямо в редакторе?
Дядя Миша писал: Я в этой схеме вообще не вижу клиент-серверной архитектуры, поэтому такого порядка событий у меня и не будет. Да и вообще тут странно приоритеты расставленны.
Не очень понятно, а каким образом синхронизироваться с тактами физдвижка к примеру? Ну допустим если у нас такты физики считаются допустим фиксировано в 25фпс, а камера аттачится к такому объекту при нефиксированом фпс, это приведёт к подергиваниям. Придется городить костыли с высчитыванием дельты? А если я хочу вызвать скрипт когда уже кадр отрисован?
Цитата:
Дядя Миша писал: Не совсем. Предполагается на что на скриптовом языке будет полностью написана вся игровая часть кода, как в Quake. Это самый удобный вариант.
Если же объекты существуют внутри движка, а взаимодтействие с ними идёт через различные скрипты, обязательно возникнут ситуации, которые не решаются и которые пообещают решить в новой версии. Я заведомо не хочу создавать такую ситуацию.
Я про другое, вот допустим у тебя есть объект, он наследует класс ригидбоди, у которого например есть булева - ис кинематик. Так вот как мне её переключать? А если я например создаю инстансами эти объекты и мне надо у какого то из них переключить эту булеву?
Цитата:
Дядя Миша писал: Вот есть Half-Life SDK написанный на С++. А теперь представь что вместо С++ - мой скриптовой язык. Который специально точился под все эти игровые особенности и заморочки. То есть будут такие же библиотеки как для халфы с очень-очень похожим на С++ кодом. Но с кучей возможностей, нереализуемых на С++ безкостыльными методами.
Т.е. будет некий init.cpp из которого вызываем все наши функции, правильно?
Цитата:
Дядя Миша писал: Но в физике нет понятия "видеть". Должно быть ты имел в виду столкновения?
Самый простой пример - трасса из ориджина объекта, сталкивается с его собственным колайдером. Как это решить?
Цитата:
Дядя Миша писал: Через скрипт я думаю никак, да и навряд ли это понадобится. Вот из материала прочитать свойства объекта - это да, такая возможность будет. На мой взгляд это гораздо более оптимально.
Ну вот у меня есть простой шейдер, который по локальной нормали объекта рисует тень на глазах, и всё бы ничего пока ты не начнешь вращать башкой. Для этого я передаю vector3 поворота кости головы прямиком в шейдер. Это даже умеет убогий game maker самых древних версий, а ты говоришь не нужны. Или предполагается создавать 3 отдельных флоата в самом материале?
Цитата:
Дядя Миша писал: Редактор сможет симулировать игровой мир, да.
Супер, и гизмо можно рисовать?
И самое интересное, будет ли какой то быстрый способ использовать движковый таймер и синхронизироваться с ним?
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!