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

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

Рейтинг



Дядя Миша
Я про это: https://docs.unity3d.com/Manual/IL2CPP.html

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

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

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

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

Рейтинг



Ну там сишарп, я не знаю что они в очередной раз выдумали.

Добавлено 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'

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

Старое сообщение 03-02-2023 16:46
-
FiEctro
Кот Арсис

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

Рейтинг



https://twitter.com/BinaryImpactG/s...883380281876480
https://a.radikal.host/2023/02/09/FoWjni2X0AEJMx7.png

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

Отредактировано FiEctro 09-02-2023 в 11:20

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

Старое сообщение 09-02-2023 11:16
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32210
Нанёс повреждений: 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: Записан
Сообщение: 212661

Старое сообщение 09-02-2023 12:43
-
FiEctro
Кот Арсис

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

Рейтинг



Дядя Миша
Там написано.

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

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

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

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32210
Нанёс повреждений: 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: Записан
Сообщение: 212665

Старое сообщение 09-02-2023 14:31
-
FiEctro
Кот Арсис

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

Рейтинг



Дядя Миша
Я так понял получает доступ к последнему индексу в листе.

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

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

Старое сообщение 10-02-2023 05:47
- За что?
 Дядя Миша
racing for fish

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

Рейтинг



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

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

Старое сообщение 10-02-2023 09:53
-
 Дядя Миша
racing for fish

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

Рейтинг



Минутка прекрасного

Продемонстрирую во что превращается вот эта функция

C++ Source Code:
1
void load_identity( void )
2
{
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 );
7
}

После компиляции. Т.е. как её видит интерпретатор виртуальной машины:
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' );
19
6.RETURN: void;
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' );
34
10.RETURN: void;
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' );
51
6.RETURN: void;
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' );
66
10.RETURN: void;
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' );
83
6.RETURN: void;
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' );
98
10.RETURN: void;
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' );
115
6.RETURN: void;
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' );
130
10.RETURN: void;
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 );
135
0.RETURN: void;
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 );
139
0.RETURN: void;
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 );
143
0.RETURN: void;
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 );
147
0.RETURN: void;
148
68.RETURN: void;

148 инструкций. Правда это дебаг-сборка, в релизе инструкций будет поменьше.

__________________
My Projects: download page

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

Цитата:

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

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

Старое сообщение 15-02-2023 07:53
-
FiEctro
Кот Арсис

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

Рейтинг



Это ассемблер? Значит всё же можно скомпилировать как обычный код?

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

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

Старое сообщение 15-02-2023 08:21
- За что?
 Дядя Миша
racing for fish

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

Рейтинг



Это мой собственный ассемблер. Он не совместим с обычным.

Цитата:
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: Записан
Сообщение: 212749

Старое сообщение 15-02-2023 09:08
-
 Дядя Миша
racing for fish

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

Рейтинг



Ну вот товарищи, в процессе портирования энтить на новый язык ожидаемо столкнулся с большим геморроем, который на С++ вообще не имеет изящного решения. А именно - представление энумераторов в качестве имён.
Пока мы хотим от них иметь только номера - проблемы нет. Но стоит нам захотить получить ассоциированную связку имя<->уникальный идентификатор, то начинаются проблемы. Которые решают обычно костылём. Напомню как это сделано в той же халфе:

C++ Source Code:
1
typedef enum
2
{
3
  ACT_RESET = 0,		// Set m_Activity to this invalid value to force a reset to m_IdealActivity
4
  ACT_IDLE = 1,
5
  ACT_GUARD,
6
  ACT_WALK,
7
  ACT_RUN,
8
  ACT_FLY,

Это наши идентификаторы. То есть уникальные номера. Однако нам по смыслу нужны не только номера, но ещё и имена этих номеров. И тут уже начинаются проблемы. С++ не располагает средствами для их автоматической ассоциации. Поэтому заводим структурку конверсии:
C++ Source Code:
1
typedef struct
2
{
3
  int		type;
4
  const char	*name;
5
} activity_map_t;

В принципе это вальвовский избыточный говнокод и int type тут вообще не нужен, т.к. он совпадает с номером индекса в массиве. Я просто привожу оригинальный код. Дальше через макрос!!! инициализируем его вот так:
C++ Source Code:
1
#define _A( a ) { a, #a }
2
 
3
activity_map_t activity_map[] =
4
{
5
  _A( ACT_RESET ),
6
  _A( ACT_IDLE ),
7
  _A( ACT_GUARD ),
8
  _A( ACT_WALK ),
9
  _A( ACT_RUN ),
10
  _A( ACT_FLY ),

Т.е. никаких других средств в С++ для превращения имени переменной в строку попросту нет. Специально выделил жирным, потому что имена и строки в парадигме того же С++ это разные вещи.

Понятное дело что это вообще не удобно. В HL2, как вы знаете отошли от стратегии жесткой привязки актов к индексам, потому что ваша анимационно-зависимая модель фактически прибита гвоздями к какому-то грёбанному энуму в игровом коде. Это само по себе не представляло бы проблемы, если бы не было точно такой же привязки к этому энуму - в компиляторе студиомоделей. Теперь на минутку представим, что они отличаются. Ну и всё поломалось. С именами, понятное дело, такое не произойдет. Собственно в XashNT активность задаётся именами, однако встаёт вопрос как описать этот долбанный стейт. Даже если учесть что в данном случае нам вообще не нужна таблица, а достаточно лишь имён - их ведь надо проинициализировать! То есть типичная форма инициализации будет выглядеть как-то так:
C++ Source Code:
string ACT_RESET = "ACT_RESET";

Это конечно можно обвернуть в макросы, аналогичные вышеприведённому, но для компилятора эти строчки так и останутся кучей несвязанных. Они ничего не будет знать об их группировке и принадлежности, чтобы, например избежать ненадлежащего приведения типов. А это было бы весьма полезно. Я предлагаю следующее решение данной проблемы:
C++ Source Code:
1
stringtable Activity
2
{
3
  ACT_RESET,
4
  ACT_IDLE,
5
  ACT_GUARD,
6
  ACT_WALK,
7
  ACT_RUN,
8
  ACT_FLY,

Во первых строчки группируются по принадлежности к группе 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'

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

Старое сообщение 01-03-2023 11:30
-
 Дядя Миша
racing for fish

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

Рейтинг



Вы всё еще можете предложить тут что-то улучшить. Например вместо ключевого слова stringtable - какое-то другое.

__________________
My Projects: download page

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

Цитата:

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

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

Старое сообщение 02-03-2023 05:19
-
FiEctro
Кот Арсис

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

Рейтинг



Почему просто массив не использовать? Или Листы из шарпов.

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

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

Старое сообщение 02-03-2023 09:18
- За что?
nemyax
Нёмыч

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 4137

Рейтинг



Цитата:
Дядя Миша писал:
для компилятора эти строчки так и останутся кучей несвязанных. Они ничего не будет знать об их группировке и принадлежности

В неймспейс завернуть можно.

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

Старое сообщение 02-03-2023 09:31
- За что?
Тема: (Опционально)
Ваш ответ:



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


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

Временная зона GMT. Текущее время 04:28. Новая тема    Ответить
Страницы (11): « Первая ... « 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