__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Ну там сишарп, я не знаю что они в очередной раз выдумали.
Добавлено 03-02-2023 в 19:32:
Вообще конечно интересные дела с этими исключениями. Судя по всему существует два типа обработчика исключений.
Первый - классический, когда стек разматывается обратно и мы выходим из блока try. Ну а дальше по ситуации вызываем либо секцию __except либо секцию __finally. Причём секция __finally будет вызвана в любом случае, т.к. это некий аналог ручного деструктора. В С++ этой секции нет. Почему?
Ну очевидно потому что исключения в С++ самостоятельно и корректно вызывают все деструкторы из всего стека, который они успели накопить на момент проброса исключения или вызова leave; Технически какой сигнал бросать совершенно не важно, исключения это просто очередной механизм обработки событий, эвенты в который могут поступать с разных сторон.
Таким образом становится понятно, что никакого смысла в секции finally попросту нет - всё что было выделено внутри вызванных функций будет корректно уничтожено вызовом деструкторов (в чистом Си не будет сделано вообще ничего), а то что было выделено на одном уровне с блоком try может быть прекрасно освобождено вообще безо всяких дополнительных секций.
Другой конечно вопрос, а как дать программе понять, что нам не нужно бросать исключения, а просто иногда нужен досрочный выход?
Добавлено 03-02-2023 в 19:46:
А, вон оно что оказывается. __try, __except, __finally - это SEH.
А try catch throw - это С++. Теперь понятно.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Дядя Миша
Я так понял получает доступ к последнему индексу в листе.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
В шарпе класс массива встроеный жи. А у меня можно добавить новый метод, и например назвать его top. По длине написания примерно тоже самое, но нагляднее. Но можно и в операторе доступа захэндлить значение -1, например.
Это ассемблер? Значит всё же можно скомпилировать как обычный код?
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Это мой собственный ассемблер. Он не совместим с обычным.
Цитата:
FiEctro писал: Значит всё же можно скомпилировать как обычный код?
Мой язык использует конструкции, которые невозможны в других языках.
Точнее возможны, но вместо одного красивого вызова придётся ручками много чего сделать. Ну собственно, языки для того и нужны - чтобы освободить от лишней работы. А больше они ни для чего не нужны.
Ну вот товарищи, в процессе портирования энтить на новый язык ожидаемо столкнулся с большим геморроем, который на С++ вообще не имеет изящного решения. А именно - представление энумераторов в качестве имён.
Пока мы хотим от них иметь только номера - проблемы нет. Но стоит нам захотить получить ассоциированную связку имя<->уникальный идентификатор, то начинаются проблемы. Которые решают обычно костылём. Напомню как это сделано в той же халфе:
C++ Source Code:
1
typedefenum
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
typedefstruct
2
{
3
int type;
4
constchar *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 со строками. Т.е. для программиста это будет выглядеть именно как работа с энумератором.
Почему просто массив не использовать? Или Листы из шарпов.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!