HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Флуд > Заметки на полях
Разработка С++ совместимой виртуальной машины
Страницы (11): « Первая ... « 3 4 5 6 [7] 8 9 10 11 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Нигде, естественно. Это одна из тех идиотских задачек, которые любят задавать на собеседованиях.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 211896

Старое сообщение 02-12-2022 12:19
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Дядя Миша
Вот тут подробно написано про sequence points и order of evaluation:
https://en.cppreference.com/w/cpp/language/eval_order

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 211897

Старое сообщение 02-12-2022 12:20
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



XaeroX ты невнимательно читал мой пост. Я спрашивал вот это вот

C++ Source Code:
j ++i++;

Вообще в принципе хоть где-то скомпилируется или нет?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 211898

Старое сообщение 02-12-2022 12:48
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12882
Возраст: 32

Рейтинг



Цитата:
Дядя Миша писал:
Нигде, естественно. Это одна из тех идиотских задачек, которые любят задавать на собеседованиях.



Тогда почему просто ошибку не вывести?

Сообщить модератору | | IP: Записан
Сообщение: 211899

Старое сообщение 02-12-2022 13:42
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Так я пытаюсь понять что должно компилироваться, а что нет.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 211900

Старое сообщение 02-12-2022 14:44
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Дядя Миша
Если это UB - то никто никому ничего не должен.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 211901

Старое сообщение 02-12-2022 15:05
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Ну чтож, насколько я могу судить, источником 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 в полный рост. Интересно будет сравнить результаты с более свежими студиями.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 211906

Старое сообщение 03-12-2022 13:07
-
Дикс
Seamless Realm

Дата регистрации: Mar 2019
Проживает: Да
Сообщений: 666

Рейтинг



Студия 19

4 = ++i + ++i; 2 = i;
0 = i++ + i++; 2 = i;
2 = ++i + i++; 2 = i;
2 = i++ + ++i; 2 = i;

с форума копипастится вместе с номерами строк
Залил исходный код на https://pastebin.com/vFkruZpB

__________________
igroprom.d3.ru

Сообщить модератору | | IP: Записан
Сообщение: 211907

Старое сообщение 03-12-2022 13:15
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Если между шестёркой и 19-й студией отличий нет, думаю во всей линейке микрософтовских компиляторов их и не будет. Но всякие там GCC любопытно было бы взглянуть, да.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 211908

Старое сообщение 03-12-2022 13:16
-
Дикс
Seamless Realm

Дата регистрации: Mar 2019
Проживает: Да
Сообщений: 666

Рейтинг



4 = ++i + ++i; 2 = i;
1 = i++ + i++; 2 = i;
3 = ++i + i++; 2 = i;
2 = i++ + ++i; 2 = i;

g++ --version
g++ (Debian 10.2.1-6) 10.2.1 20210110
Copyright (C) 2020 Free Software Foundation, Inc.

__________________
igroprom.d3.ru

Сообщить модератору | | IP: Записан
Сообщение: 211909

Старое сообщение 03-12-2022 13:20
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Полная версия экспериментов:

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;
5
2 = ++i++; 2 = i;
6
0 = ++i--; 0 = i;
7
0 = --i++; 0 = i;
8
-2 = --i--; -2 = i;
9
8 = ++i++ + ++i++; 4 = i;
10
14 = ++i++ + ++i++ + ++i++; 6 = i;

Последние пять примеров студией не скомпилятся.

Добавлено 03-12-2022 в 16:41:

Кстати вот это вот ++i-- на баш.орге когда-то назвали "оператор подёргивания", если кто-то ещё помнит.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 211910

Старое сообщение 03-12-2022 13:41
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Вот ещё какая шляпа выяснилась. Я над этим не задумывался просто потому, что оно мне было не нужно. Дело в том, что new для массива возможен только с дефолтным конструктором. Нельзя написать что-то типа

C++ Source Code:
new foo( 1 )[100];

Ну то есть может оно и можно, но шестёрка не даёт этого сделать.
Причём сам массив работает как для классов, так и для POD-типов, но кастомный конструктор тут вызвать нельзя. Впрочем у меня наверное вообще не будет этой возможности, т.к. она вступает в серъезные противоречия с концепцией всей виртуальной машины. Ну или если быть точным - это же придётся городить какую-то отдельную структуру, которая во первых будет разом высвобождать всё, а во вторых её надо где-то хранить и оберегать от попыток высвободить память через free, например.

Добавлено 04-12-2022 в 15:52:

ЗЫ. Эта штука вообще походу какой-то костыль, потому что, например нельзя написать вот так
C++ Source Code:
new foo[100][100];

Т.е. многомерный массив таким образом тоже не сделать. Впрочем его обычно используют для выделения массива POD-типов или АТД-типов.
Чего-то такого без виртуальных деструкторов. Во избежание.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 211917

Старое сообщение 04-12-2022 12:52
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12882
Возраст: 32

Рейтинг



Дядя Миша
Скажи, а как в твоей виртуальной машине будет обрабатываться порядок событий?
https://habr.com/ru/post/147315/
https://docs.unity3d.com/ru/530/uploads/Main/monobehaviour_flowchart.svg

Можно будет обращаться к скрипту как компоненту энтитии? Например на объекте висит скрипт вызывающий класс Ригидбоди. Каким образом к нему обратиться у тебя?

Как можно будет задать объектам и физике слои, чтобы одни могли видеть друг друга, а другие нет?

Куда завернуты материалы с шейдерами? Как с ними общаться через скрипт?

Возможно будет сделать выполнение скрипта прямо в редакторе?

Отредактировано FiEctro 05-12-2022 в 13:47

Сообщить модератору | | IP: Записан
Сообщение: 211928

Старое сообщение 05-12-2022 13:28
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Я в этой схеме вообще не вижу клиент-серверной архитектуры, поэтому такого порядка событий у меня и не будет. Да и вообще тут странно приоритеты расставленны.

Цитата:
FiEctro писал:
Можно будет обращаться к скрипту как компоненту энтитии?

Не совсем. Предполагается на что на скриптовом языке будет полностью написана вся игровая часть кода, как в Quake. Это самый удобный вариант.
Если же объекты существуют внутри движка, а взаимодтействие с ними идёт через различные скрипты, обязательно возникнут ситуации, которые не решаются и которые пообещают решить в новой версии. Я заведомо не хочу создавать такую ситуацию.

Цитата:
FiEctro писал:
Например на объекте висит скрипт вызывающий класс Ригидбоди

Вот есть Half-Life SDK написанный на С++. А теперь представь что вместо С++ - мой скриптовой язык. Который специально точился под все эти игровые особенности и заморочки. То есть будут такие же библиотеки как для халфы с очень-очень похожим на С++ кодом. Но с кучей возможностей, нереализуемых на С++ безкостыльными методами.

Цитата:
FiEctro писал:
Как можно будет задать объектам и физике слои, чтобы одни могли видеть друг друга, а другие нет?

Но в физике нет понятия "видеть". Должно быть ты имел в виду столкновения?

Цитата:
FiEctro писал:
Куда завернуты материалы с шейдерами? Как с ними общаться через скрипт?

Через скрипт я думаю никак, да и навряд ли это понадобится. Вот из материала прочитать свойства объекта - это да, такая возможность будет. На мой взгляд это гораздо более оптимально.

Цитата:
FiEctro писал:
Возможно будет сделать выполнение скрипта прямо в редакторе?

Редактор сможет симулировать игровой мир, да.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 211930

Старое сообщение 05-12-2022 14:38
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12882
Возраст: 32

Рейтинг



Цитата:
Дядя Миша писал:
Я в этой схеме вообще не вижу клиент-серверной архитектуры, поэтому такого порядка событий у меня и не будет. Да и вообще тут странно приоритеты расставленны.


Не очень понятно, а каким образом синхронизироваться с тактами физдвижка к примеру? Ну допустим если у нас такты физики считаются допустим фиксировано в 25фпс, а камера аттачится к такому объекту при нефиксированом фпс, это приведёт к подергиваниям. Придется городить костыли с высчитыванием дельты? А если я хочу вызвать скрипт когда уже кадр отрисован?

Цитата:
Дядя Миша писал:
Не совсем. Предполагается на что на скриптовом языке будет полностью написана вся игровая часть кода, как в Quake. Это самый удобный вариант.
Если же объекты существуют внутри движка, а взаимодтействие с ними идёт через различные скрипты, обязательно возникнут ситуации, которые не решаются и которые пообещают решить в новой версии. Я заведомо не хочу создавать такую ситуацию.


Я про другое, вот допустим у тебя есть объект, он наследует класс ригидбоди, у которого например есть булева - ис кинематик. Так вот как мне её переключать? А если я например создаю инстансами эти объекты и мне надо у какого то из них переключить эту булеву?

Цитата:
Дядя Миша писал:
Вот есть Half-Life SDK написанный на С++. А теперь представь что вместо С++ - мой скриптовой язык. Который специально точился под все эти игровые особенности и заморочки. То есть будут такие же библиотеки как для халфы с очень-очень похожим на С++ кодом. Но с кучей возможностей, нереализуемых на С++ безкостыльными методами.


Т.е. будет некий init.cpp из которого вызываем все наши функции, правильно?

Цитата:
Дядя Миша писал:
Но в физике нет понятия "видеть". Должно быть ты имел в виду столкновения?


Самый простой пример - трасса из ориджина объекта, сталкивается с его собственным колайдером. Как это решить?

Цитата:
Дядя Миша писал:
Через скрипт я думаю никак, да и навряд ли это понадобится. Вот из материала прочитать свойства объекта - это да, такая возможность будет. На мой взгляд это гораздо более оптимально.


Ну вот у меня есть простой шейдер, который по локальной нормали объекта рисует тень на глазах, и всё бы ничего пока ты не начнешь вращать башкой. Для этого я передаю vector3 поворота кости головы прямиком в шейдер. Это даже умеет убогий game maker самых древних версий, а ты говоришь не нужны. Или предполагается создавать 3 отдельных флоата в самом материале?

Цитата:
Дядя Миша писал:
Редактор сможет симулировать игровой мир, да.


Супер, и гизмо можно рисовать?

И самое интересное, будет ли какой то быстрый способ использовать движковый таймер и синхронизироваться с ним?

Отредактировано FiEctro 05-12-2022 в 15:13

Сообщить модератору | | IP: Записан
Сообщение: 211932

Старое сообщение 05-12-2022 15:10
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 11:10. Новая тема    Ответить
Страницы (11): « Первая ... « 3 4 5 6 [7] 8 9 10 11 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Флуд > Заметки на полях
Разработка С++ совместимой виртуальной машины
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024