HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Флуд (https://hlfx.ru/forum/forumdisplay.php?forumid=11)
-- Заметки на полях (https://hlfx.ru/forum/showthread.php?threadid=5815)
Отправлено FiEctro 03-02-2023 в 15:47:
Дядя Миша
Я про это: https://docs.unity3d.com/Manual/IL2CPP.html
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено Дядя Миша 03-02-2023 в 16:46:
Ну там сишарп, я не знаю что они в очередной раз выдумали.
Добавлено 03-02-2023 в 19:32:
Вообще конечно интересные дела с этими исключениями. Судя по всему существует два типа обработчика исключений.
Первый - классический, когда стек разматывается обратно и мы выходим из блока try. Ну а дальше по ситуации вызываем либо секцию __except либо секцию __finally. Причём секция __finally будет вызвана в любом случае, т.к. это некий аналог ручного деструктора. В С++ этой секции нет. Почему?
Ну очевидно потому что исключения в С++ самостоятельно и корректно вызывают все деструкторы из всего стека, который они успели накопить на момент проброса исключения или вызова leave; Технически какой сигнал бросать совершенно не важно, исключения это просто очередной механизм обработки событий, эвенты в который могут поступать с разных сторон.
Таким образом становится понятно, что никакого смысла в секции finally попросту нет - всё что было выделено внутри вызванных функций будет корректно уничтожено вызовом деструкторов (в чистом Си не будет сделано вообще ничего), а то что было выделено на одном уровне с блоком try может быть прекрасно освобождено вообще безо всяких дополнительных секций.
Другой конечно вопрос, а как дать программе понять, что нам не нужно бросать исключения, а просто иногда нужен досрочный выход?
Добавлено 03-02-2023 в 19:46:
А, вон оно что оказывается. __try, __except, __finally - это SEH.
А try catch throw - это С++. Теперь понятно.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FiEctro 09-02-2023 в 11:16:
https://twitter.com/BinaryImpactG/s...883380281876480

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено Дядя Миша 09-02-2023 в 12:43:
Это чего?
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FiEctro 09-02-2023 в 13:35:
Дядя Миша
Там написано.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено Дядя Миша 09-02-2023 в 14:31:
Непонятна.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FiEctro 10-02-2023 в 05:47:
Дядя Миша
Я так понял получает доступ к последнему индексу в листе.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено Дядя Миша 10-02-2023 в 09:53:
В шарпе класс массива встроеный жи. А у меня можно добавить новый метод, и например назвать его top. По длине написания примерно тоже самое, но нагляднее. Но можно и в операторе доступа захэндлить значение -1, например.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Дядя Миша 15-02-2023 в 07:53:
Минутка прекрасного
Продемонстрирую во что превращается вот эта функция
C++ Source Code:
1 | void load_identity( void ) |
3 | mat[0] = vec3( 1.0f, 0.0f, 0.0f ); |
4 | mat[1] = vec3( 0.0f, 1.0f, 0.0f ); |
5 | mat[2] = vec3( 0.0f, 0.0f, 1.0f ); |
6 | mat[3] = vec3( 0.0f, 0.0f, 0.0f ); |
После компиляции. Т.е. как её видит интерпретатор виртуальной машины:
C++ Source Code:
1 | 87.ADD_P: stack[12]( xform* <RESULT> = '3373108' ) = stack[0]( CBaseEntity* this = '3372528' ) + heap[30684]( xform m_local = '580' ); |
2 | 88.PUSH_P: stack[52] = stack[12]( xform* <TYPECAST> = '3373108' ); |
3 | 89.OBJECT_CALL: xform::load_identity( locals 108, args 1, size 4 ); |
4 | 0.ADD_P: stack[4]( vec3[4]* <RESULT> = '3373108' ) = stack[0]( xform* this = '3373108' ) + heap[11568]( vec3[4] mat = '0' ); |
5 | 1.CHECKRANGE: heap[208]( int <IMMEDIATE> = '0' ) >= heap[208]( int <IMMEDIATE> = '0' ) < heap[372]( int <IMMEDIATE> = '4' ); |
6 | 2.ADD_P: stack[8]( vec3* <RESULT> = '3373108' ) = stack[4]( vec3[4] <TYPECAST> = '3373108' ) + heap[208]( int <IMMEDIATE> = '0' ); |
7 | 3.TAKE_ADDR: stack[24]( vec3* <RESULT> = '283006512' ) = &stack[12]( <TEMPOBJECT> ); |
8 | 4.PUSH_P: stack[108] = stack[24]( vec3* <RESULT> = '283006512' ); |
9 | 5.PUSH_F: stack[112] = heap[7140]( float <IMMEDIATE> = '1' ); |
10 | 6.PUSH_F: stack[116] = heap[2948]( float <IMMEDIATE> = '0' ); |
11 | 7.PUSH_F: stack[120] = heap[2948]( float <IMMEDIATE> = '0' ); |
12 | 8.OBJECT_CALL: vec3::ctor( locals 28, args 4, size 16 ); |
13 | 0.ADD_P: stack[16]( float* <RESULT> = '283006512' ) = stack[0]( vec3* this = '283006512' ) + heap[3340]( float x = '0' ); |
14 | 1.STORE_F: stack[16]->address[283006512]->( float <TYPECAST> = '1' ) = stack[4]( float a0 = '1' ); |
15 | 2.ADD_P: stack[20]( float* <RESULT> = '283006516' ) = stack[0]( vec3* this = '283006512' ) + heap[3344]( float y = '4' ); |
16 | 3.STORE_F: stack[20]->address[283006516]->( float <TYPECAST> = '0' ) = stack[8]( float a1 = '0' ); |
17 | 4.ADD_P: stack[24]( float* <RESULT> = '283006520' ) = stack[0]( vec3* this = '283006512' ) + heap[3348]( float z = '8' ); |
18 | 5.STORE_F: stack[24]->address[283006520]->( float <TYPECAST> = '0' ) = stack[12]( float a2 = '0' ); |
20 | 9.PUSH_P: stack[108] = stack[8]( vec3* <TYPECAST> = '3373108' ); |
21 | 10.TAKE_ADDR: stack[28]( const vec3* <RESULT> = '283006512' ) = &stack[12]( <TEMPOBJECT> ); |
22 | 11.PUSH_P&: stack[112] = stack[28]( const vec3* <RESULT> = '283006512' ); |
23 | 12.OBJECT_CALL: vec3::=( locals 32, args 2, size 8 ); |
24 | 0.ADD_P: stack[8]( float* <RESULT> = '3373108' ) = stack[0]( vec3* this = '3373108' ) + heap[3340]( float x = '0' ); |
25 | 1.ADD_P: stack[12]( float* <RESULT> = '283006512' ) = stack[4]( vec3 <TYPECAST> = '283006512' ) + heap[3340]( float x = '0' ); |
26 | 2.STORE_F: stack[8]->address[3373108]->( float <TYPECAST> = '1' ) = stack[12]->address[283006512]->( float <TYPECAST> = '1' ); |
27 | 3.ADD_P: stack[16]( float* <RESULT> = '3373112' ) = stack[0]( vec3* this = '3373108' ) + heap[3344]( float y = '4' ); |
28 | 4.ADD_P: stack[20]( float* <RESULT> = '283006516' ) = stack[4]( vec3 <TYPECAST> = '283006512' ) + heap[3344]( float y = '4' ); |
29 | 5.STORE_F: stack[16]->address[3373112]->( float <TYPECAST> = '0' ) = stack[20]->address[283006516]->( float <TYPECAST> = '0' ); |
30 | 6.ADD_P: stack[24]( float* <RESULT> = '3373116' ) = stack[0]( vec3* this = '3373108' ) + heap[3348]( float z = '8' ); |
31 | 7.ADD_P: stack[28]( float* <RESULT> = '283006520' ) = stack[4]( vec3 <TYPECAST> = '283006512' ) + heap[3348]( float z = '8' ); |
32 | 8.STORE_F: stack[24]->address[3373116]->( float <TYPECAST> = '0' ) = stack[28]->address[283006520]->( float <TYPECAST> = '0' ); |
33 | 9.STORE_P&: heap[0]( int <RETURN> = '3373108' ) = stack[0]( vec3* <TYPECAST> = '3373108' ); |
35 | 13.STORE_P&: stack[32]( vec3* <RESULT> = '3373108' ) = heap[0]( int <RETURN> = '3373108' ); |
36 | 14.ADD_P: stack[36]( vec3[4]* <RESULT> = '3373108' ) = stack[0]( xform* this = '3373108' ) + heap[11568]( vec3[4] mat = '0' ); |
37 | 15.CHECKRANGE: heap[208]( int <IMMEDIATE> = '0' ) >= heap[104]( int <IMMEDIATE> = '1' ) < heap[372]( int <IMMEDIATE> = '4' ); |
38 | 16.ADD_P: stack[40]( vec3* <RESULT> = '3373120' ) = stack[36]( vec3[4] <TYPECAST> = '3373108' ) + heap[3656]( int <IMMEDIATE> = '12' ); |
39 | 17.TAKE_ADDR: stack[24]( vec3* <RESULT> = '283006544' ) = &stack[44]( <TEMPOBJECT> ); |
40 | 18.PUSH_P: stack[108] = stack[24]( vec3* <RESULT> = '283006544' ); |
41 | 19.PUSH_F: stack[112] = heap[2948]( float <IMMEDIATE> = '0' ); |
42 | 20.PUSH_F: stack[116] = heap[7140]( float <IMMEDIATE> = '1' ); |
43 | 21.PUSH_F: stack[120] = heap[2948]( float <IMMEDIATE> = '0' ); |
44 | 22.OBJECT_CALL: vec3::ctor( locals 28, args 4, size 16 ); |
45 | 0.ADD_P: stack[16]( float* <RESULT> = '283006544' ) = stack[0]( vec3* this = '283006544' ) + heap[3340]( float x = '0' ); |
46 | 1.STORE_F: stack[16]->address[283006544]->( float <TYPECAST> = '0' ) = stack[4]( float a0 = '0' ); |
47 | 2.ADD_P: stack[20]( float* <RESULT> = '283006548' ) = stack[0]( vec3* this = '283006544' ) + heap[3344]( float y = '4' ); |
48 | 3.STORE_F: stack[20]->address[283006548]->( float <TYPECAST> = '1' ) = stack[8]( float a1 = '1' ); |
49 | 4.ADD_P: stack[24]( float* <RESULT> = '283006552' ) = stack[0]( vec3* this = '283006544' ) + heap[3348]( float z = '8' ); |
50 | 5.STORE_F: stack[24]->address[283006552]->( float <TYPECAST> = '0' ) = stack[12]( float a2 = '0' ); |
52 | 23.PUSH_P: stack[108] = stack[40]( vec3* <TYPECAST> = '3373120' ); |
53 | 24.TAKE_ADDR: stack[28]( const vec3* <RESULT> = '283006544' ) = &stack[44]( <TEMPOBJECT> ); |
54 | 25.PUSH_P&: stack[112] = stack[28]( const vec3* <RESULT> = '283006544' ); |
55 | 26.OBJECT_CALL: vec3::=( locals 32, args 2, size 8 ); |
56 | 0.ADD_P: stack[8]( float* <RESULT> = '3373120' ) = stack[0]( vec3* this = '3373120' ) + heap[3340]( float x = '0' ); |
57 | 1.ADD_P: stack[12]( float* <RESULT> = '283006544' ) = stack[4]( vec3 <TYPECAST> = '283006544' ) + heap[3340]( float x = '0' ); |
58 | 2.STORE_F: stack[8]->address[3373120]->( float <TYPECAST> = '0' ) = stack[12]->address[283006544]->( float <TYPECAST> = '0' ); |
59 | 3.ADD_P: stack[16]( float* <RESULT> = '3373124' ) = stack[0]( vec3* this = '3373120' ) + heap[3344]( float y = '4' ); |
60 | 4.ADD_P: stack[20]( float* <RESULT> = '283006548' ) = stack[4]( vec3 <TYPECAST> = '283006544' ) + heap[3344]( float y = '4' ); |
61 | 5.STORE_F: stack[16]->address[3373124]->( float <TYPECAST> = '1' ) = stack[20]->address[283006548]->( float <TYPECAST> = '1' ); |
62 | 6.ADD_P: stack[24]( float* <RESULT> = '3373128' ) = stack[0]( vec3* this = '3373120' ) + heap[3348]( float z = '8' ); |
63 | 7.ADD_P: stack[28]( float* <RESULT> = '283006552' ) = stack[4]( vec3 <TYPECAST> = '283006544' ) + heap[3348]( float z = '8' ); |
64 | 8.STORE_F: stack[24]->address[3373128]->( float <TYPECAST> = '0' ) = stack[28]->address[283006552]->( float <TYPECAST> = '0' ); |
65 | 9.STORE_P&: heap[0]( int <RETURN> = '3373120' ) = stack[0]( vec3* <TYPECAST> = '3373120' ); |
67 | 27.STORE_P&: stack[56]( vec3* <RESULT> = '3373120' ) = heap[0]( int <RETURN> = '3373120' ); |
68 | 28.ADD_P: stack[60]( vec3[4]* <RESULT> = '3373108' ) = stack[0]( xform* this = '3373108' ) + heap[11568]( vec3[4] mat = '0' ); |
69 | 29.CHECKRANGE: heap[208]( int <IMMEDIATE> = '0' ) >= heap[376]( int <IMMEDIATE> = '2' ) < heap[372]( int <IMMEDIATE> = '4' ); |
70 | 30.ADD_P: stack[64]( vec3* <RESULT> = '3373132' ) = stack[60]( vec3[4] <TYPECAST> = '3373108' ) + heap[7476]( int <IMMEDIATE> = '24' ); |
71 | 31.TAKE_ADDR: stack[24]( vec3* <RESULT> = '283006568' ) = &stack[68]( <TEMPOBJECT> ); |
72 | 32.PUSH_P: stack[108] = stack[24]( vec3* <RESULT> = '283006568' ); |
73 | 33.PUSH_F: stack[112] = heap[2948]( float <IMMEDIATE> = '0' ); |
74 | 34.PUSH_F: stack[116] = heap[2948]( float <IMMEDIATE> = '0' ); |
75 | 35.PUSH_F: stack[120] = heap[7140]( float <IMMEDIATE> = '1' ); |
76 | 36.OBJECT_CALL: vec3::ctor( locals 28, args 4, size 16 ); |
77 | 0.ADD_P: stack[16]( float* <RESULT> = '283006568' ) = stack[0]( vec3* this = '283006568' ) + heap[3340]( float x = '0' ); |
78 | 1.STORE_F: stack[16]->address[283006568]->( float <TYPECAST> = '0' ) = stack[4]( float a0 = '0' ); |
79 | 2.ADD_P: stack[20]( float* <RESULT> = '283006572' ) = stack[0]( vec3* this = '283006568' ) + heap[3344]( float y = '4' ); |
80 | 3.STORE_F: stack[20]->address[283006572]->( float <TYPECAST> = '0' ) = stack[8]( float a1 = '0' ); |
81 | 4.ADD_P: stack[24]( float* <RESULT> = '283006576' ) = stack[0]( vec3* this = '283006568' ) + heap[3348]( float z = '8' ); |
82 | 5.STORE_F: stack[24]->address[283006576]->( float <TYPECAST> = '1' ) = stack[12]( float a2 = '1' ); |
84 | 37.PUSH_P: stack[108] = stack[64]( vec3* <TYPECAST> = '3373132' ); |
85 | 38.TAKE_ADDR: stack[28]( const vec3* <RESULT> = '283006568' ) = &stack[68]( <TEMPOBJECT> ); |
86 | 39.PUSH_P&: stack[112] = stack[28]( const vec3* <RESULT> = '283006568' ); |
87 | 40.OBJECT_CALL: vec3::=( locals 32, args 2, size 8 ); |
88 | 0.ADD_P: stack[8]( float* <RESULT> = '3373132' ) = stack[0]( vec3* this = '3373132' ) + heap[3340]( float x = '0' ); |
89 | 1.ADD_P: stack[12]( float* <RESULT> = '283006568' ) = stack[4]( vec3 <TYPECAST> = '283006568' ) + heap[3340]( float x = '0' ); |
90 | 2.STORE_F: stack[8]->address[3373132]->( float <TYPECAST> = '0' ) = stack[12]->address[283006568]->( float <TYPECAST> = '0' ); |
91 | 3.ADD_P: stack[16]( float* <RESULT> = '3373136' ) = stack[0]( vec3* this = '3373132' ) + heap[3344]( float y = '4' ); |
92 | 4.ADD_P: stack[20]( float* <RESULT> = '283006572' ) = stack[4]( vec3 <TYPECAST> = '283006568' ) + heap[3344]( float y = '4' ); |
93 | 5.STORE_F: stack[16]->address[3373136]->( float <TYPECAST> = '0' ) = stack[20]->address[283006572]->( float <TYPECAST> = '0' ); |
94 | 6.ADD_P: stack[24]( float* <RESULT> = '3373140' ) = stack[0]( vec3* this = '3373132' ) + heap[3348]( float z = '8' ); |
95 | 7.ADD_P: stack[28]( float* <RESULT> = '283006576' ) = stack[4]( vec3 <TYPECAST> = '283006568' ) + heap[3348]( float z = '8' ); |
96 | 8.STORE_F: stack[24]->address[3373140]->( float <TYPECAST> = '1' ) = stack[28]->address[283006576]->( float <TYPECAST> = '1' ); |
97 | 9.STORE_P&: heap[0]( int <RETURN> = '3373132' ) = stack[0]( vec3* <TYPECAST> = '3373132' ); |
99 | 41.STORE_P&: stack[80]( vec3* <RESULT> = '3373132' ) = heap[0]( int <RETURN> = '3373132' ); |
100 | 42.ADD_P: stack[84]( vec3[4]* <RESULT> = '3373108' ) = stack[0]( xform* this = '3373108' ) + heap[11568]( vec3[4] mat = '0' ); |
101 | 43.CHECKRANGE: heap[208]( int <IMMEDIATE> = '0' ) >= heap[824]( int <IMMEDIATE> = '3' ) < heap[372]( int <IMMEDIATE> = '4' ); |
102 | 44.ADD_P: stack[88]( vec3* <RESULT> = '3373144' ) = stack[84]( vec3[4] <TYPECAST> = '3373108' ) + heap[3900]( int <IMMEDIATE> = '36' ); |
103 | 45.TAKE_ADDR: stack[24]( vec3* <RESULT> = '283006592' ) = &stack[92]( <TEMPOBJECT> ); |
104 | 46.PUSH_P: stack[108] = stack[24]( vec3* <RESULT> = '283006592' ); |
105 | 47.PUSH_F: stack[112] = heap[2948]( float <IMMEDIATE> = '0' ); |
106 | 48.PUSH_F: stack[116] = heap[2948]( float <IMMEDIATE> = '0' ); |
107 | 49.PUSH_F: stack[120] = heap[2948]( float <IMMEDIATE> = '0' ); |
108 | 50.OBJECT_CALL: vec3::ctor( locals 28, args 4, size 16 ); |
109 | 0.ADD_P: stack[16]( float* <RESULT> = '283006592' ) = stack[0]( vec3* this = '283006592' ) + heap[3340]( float x = '0' ); |
110 | 1.STORE_F: stack[16]->address[283006592]->( float <TYPECAST> = '0' ) = stack[4]( float a0 = '0' ); |
111 | 2.ADD_P: stack[20]( float* <RESULT> = '283006596' ) = stack[0]( vec3* this = '283006592' ) + heap[3344]( float y = '4' ); |
112 | 3.STORE_F: stack[20]->address[283006596]->( float <TYPECAST> = '0' ) = stack[8]( float a1 = '0' ); |
113 | 4.ADD_P: stack[24]( float* <RESULT> = '283006600' ) = stack[0]( vec3* this = '283006592' ) + heap[3348]( float z = '8' ); |
114 | 5.STORE_F: stack[24]->address[283006600]->( float <TYPECAST> = '0' ) = stack[12]( float a2 = '0' ); |
116 | 51.PUSH_P: stack[108] = stack[88]( vec3* <TYPECAST> = '3373144' ); |
117 | 52.TAKE_ADDR: stack[28]( const vec3* <RESULT> = '283006592' ) = &stack[92]( <TEMPOBJECT> ); |
118 | 53.PUSH_P&: stack[112] = stack[28]( const vec3* <RESULT> = '283006592' ); |
119 | 54.OBJECT_CALL: vec3::=( locals 32, args 2, size 8 ); |
120 | 0.ADD_P: stack[8]( float* <RESULT> = '3373144' ) = stack[0]( vec3* this = '3373144' ) + heap[3340]( float x = '0' ); |
121 | 1.ADD_P: stack[12]( float* <RESULT> = '283006592' ) = stack[4]( vec3 <TYPECAST> = '283006592' ) + heap[3340]( float x = '0' ); |
122 | 2.STORE_F: stack[8]->address[3373144]->( float <TYPECAST> = '0' ) = stack[12]->address[283006592]->( float <TYPECAST> = '0' ); |
123 | 3.ADD_P: stack[16]( float* <RESULT> = '3373148' ) = stack[0]( vec3* this = '3373144' ) + heap[3344]( float y = '4' ); |
124 | 4.ADD_P: stack[20]( float* <RESULT> = '283006596' ) = stack[4]( vec3 <TYPECAST> = '283006592' ) + heap[3344]( float y = '4' ); |
125 | 5.STORE_F: stack[16]->address[3373148]->( float <TYPECAST> = '0' ) = stack[20]->address[283006596]->( float <TYPECAST> = '0' ); |
126 | 6.ADD_P: stack[24]( float* <RESULT> = '3373152' ) = stack[0]( vec3* this = '3373144' ) + heap[3348]( float z = '8' ); |
127 | 7.ADD_P: stack[28]( float* <RESULT> = '283006600' ) = stack[4]( vec3 <TYPECAST> = '283006592' ) + heap[3348]( float z = '8' ); |
128 | 8.STORE_F: stack[24]->address[3373152]->( float <TYPECAST> = '0' ) = stack[28]->address[283006600]->( float <TYPECAST> = '0' ); |
129 | 9.STORE_P&: heap[0]( int <RETURN> = '3373144' ) = stack[0]( vec3* <TYPECAST> = '3373144' ); |
131 | 55.STORE_P&: stack[104]( vec3* <RESULT> = '3373144' ) = heap[0]( int <RETURN> = '3373144' ); |
132 | 56.TAKE_ADDR: stack[24]( vec3* <RESULT> = '283006592' ) = &stack[92]( <TEMPOBJECT> ); |
133 | 57.PUSH_P: stack[108] = stack[24]( vec3* <RESULT> = '283006592' ); |
134 | 58.OBJECT_CALL: vec3::dtor( locals 4, args 1, size 4 ); |
136 | 59.TAKE_ADDR: stack[24]( vec3* <RESULT> = '283006568' ) = &stack[68]( <TEMPOBJECT> ); |
137 | 60.PUSH_P: stack[108] = stack[24]( vec3* <RESULT> = '283006568' ); |
138 | 61.OBJECT_CALL: vec3::dtor( locals 4, args 1, size 4 ); |
140 | 62.TAKE_ADDR: stack[24]( vec3* <RESULT> = '283006544' ) = &stack[44]( <TEMPOBJECT> ); |
141 | 63.PUSH_P: stack[108] = stack[24]( vec3* <RESULT> = '283006544' ); |
142 | 64.OBJECT_CALL: vec3::dtor( locals 4, args 1, size 4 ); |
144 | 65.TAKE_ADDR: stack[24]( vec3* <RESULT> = '283006512' ) = &stack[12]( <TEMPOBJECT> ); |
145 | 66.PUSH_P: stack[108] = stack[24]( vec3* <RESULT> = '283006512' ); |
146 | 67.OBJECT_CALL: vec3::dtor( locals 4, args 1, size 4 ); |
148 инструкций. Правда это дебаг-сборка, в релизе инструкций будет поменьше.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FiEctro 15-02-2023 в 08:21:
Это ассемблер? Значит всё же можно скомпилировать как обычный код?
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено Дядя Миша 15-02-2023 в 09:08:
Это мой собственный ассемблер. Он не совместим с обычным.
Цитата:
FiEctro писал:
Значит всё же можно скомпилировать как обычный код?
Мой язык использует конструкции, которые невозможны в других языках.
Точнее возможны, но вместо одного красивого вызова придётся ручками много чего сделать. Ну собственно, языки для того и нужны - чтобы освободить от лишней работы. А больше они ни для чего не нужны.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Дядя Миша 01-03-2023 в 11:30:
Ну вот товарищи, в процессе портирования энтить на новый язык ожидаемо столкнулся с большим геморроем, который на С++ вообще не имеет изящного решения. А именно - представление энумераторов в качестве имён.
Пока мы хотим от них иметь только номера - проблемы нет. Но стоит нам захотить получить ассоциированную связку имя<->уникальный идентификатор, то начинаются проблемы. Которые решают обычно костылём. Напомню как это сделано в той же халфе:
C++ Source Code:
3 | ACT_RESET = 0, // Set m_Activity to this invalid value to force a reset to m_IdealActivity |
Это наши идентификаторы. То есть уникальные номера. Однако нам по смыслу нужны не только номера, но ещё и имена этих номеров. И тут уже начинаются проблемы. С++ не располагает средствами для их автоматической ассоциации. Поэтому заводим структурку конверсии:
C++ Source Code:
В принципе это вальвовский избыточный говнокод и int type тут вообще не нужен, т.к. он совпадает с номером индекса в массиве. Я просто привожу оригинальный код. Дальше через макрос!!! инициализируем его вот так:
C++ Source Code:
1 | #define _A( a ) { a, #a } |
3 | activity_map_t activity_map[] = |
Т.е. никаких других средств в С++ для превращения имени переменной в строку попросту нет. Специально выделил жирным, потому что имена и строки в парадигме того же С++ это разные вещи.
Понятное дело что это вообще не удобно. В HL2, как вы знаете отошли от стратегии жесткой привязки актов к индексам, потому что ваша анимационно-зависимая модель фактически прибита гвоздями к какому-то грёбанному энуму в игровом коде. Это само по себе не представляло бы проблемы, если бы не было точно такой же привязки к этому энуму - в компиляторе студиомоделей. Теперь на минутку представим, что они отличаются. Ну и всё поломалось. С именами, понятное дело, такое не произойдет. Собственно в XashNT активность задаётся именами, однако встаёт вопрос как описать этот долбанный стейт. Даже если учесть что в данном случае нам вообще не нужна таблица, а достаточно лишь имён - их ведь надо проинициализировать! То есть типичная форма инициализации будет выглядеть как-то так:
C++ Source Code:
string ACT_RESET = "ACT_RESET"; |
Это конечно можно обвернуть в макросы, аналогичные вышеприведённому, но для компилятора эти строчки так и останутся кучей несвязанных. Они ничего не будет знать об их группировке и принадлежности, чтобы, например избежать ненадлежащего приведения типов. А это было бы весьма полезно. Я предлагаю следующее решение данной проблемы:
C++ Source Code:
Во первых строчки группируются по принадлежности к группе Activity тем или иным образом. Даже если я не сделаю этого сейчас, это всегда можно будет ввести чуть позднее. По аналогии с тем же enumclass. Инициализация этих строчек происходит автоматически - их же именами.
Поскольку мой язык работает не с явными дублирующимися в памяти строками, а с их идентификаторами, то каждая такая строка автоматически получает свой идентификатор и может быть без проблем преобразована в целое число, отличное от ноля, если это вдруг понадобится. Так же яызк поддерживает конструкции switch-case со строками. Т.е. для программиста это будет выглядеть именно как работа с энумератором.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Дядя Миша 02-03-2023 в 05:19:
Вы всё еще можете предложить тут что-то улучшить. Например вместо ключевого слова stringtable - какое-то другое.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FiEctro 02-03-2023 в 09:18:
Почему просто массив не использовать? Или Листы из шарпов.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено nemyax 02-03-2023 в 09:31:
Цитата:
Дядя Миша писал:
для компилятора эти строчки так и останутся кучей несвязанных. Они ничего не будет знать об их группировке и принадлежности
В неймспейс завернуть можно.