Вобще я всегда нелюбил это слово, поэтому в каментах к коду использую только
TODO и FIXME. Ну еще иногда HACKHACK и TESTTEST
Кстати товарищи, вот вам от меня небольшой лайфхак. Ни для кого не секрет что очень многие начинающие программисты бояться работать с памятью, с указателями, поскольку программа вылетает. Но дело не в том, что она программа вылетает. Дело в том, какой звук она при этом издаёт!
Стандартный виндовый звук ошибки даже подготовленного человека заставляет наложить фштаны, или спровоцировать энурез, понятно.
Поэтому мой вам совет - идёте в звуковые схемы и там на звук ошибки ставите что-то более нейтральное, например "Звездочка.wav". И Вася-кот!
Дядя Миша писал: я не хотел делать редактор, поскольку он ожидаемо был бы похож на QuArK
Тебе задонатить надо или что? Иметь такой же Кварк но без кучи детских болезней сводящих половину фич на нет, было бы довольно круто.
Например дупликатор путей крут но не поддерживает симлесс-текстурирование, не поддерживает развилки, и не дружит с негативными брашами (на поворотах тоннеля возникают сверхтонкие стенки ), не умеет резать внутренней поверхностью текущего сегмента предыдущий и последующий, из-за чего на резких поворотах в тоннеле возникает этакая "слоновья нога".
При широком использовании путей и негативных брашей простое выделение браша занимает 30 секунд на той же карте с тоннелями.
Знаете, пожалуй, что самое сложное при написании компилятора программ?
Неважно настояшего или виртуальной машинки, потому что между ними разница только в том, какие опкоды этот компилятор генерирует - для процессора или виртуальные. Так вот самое сложное в том - чтобы отследить все пользовательские ошибки и выдать сообщение.
В отличие от всех остальных типов компиляторов, ну например уровней или моделей, да чего угодно, где наоборот приветствуется выдача предупреждения и нормальное продолжение работы, здесь надо ругаться на каждую мелочь. Потому что потом программа запустится и вы уже не поймете что получилось. А компилятору в целом пофигу, пока ему не сделаешь явный вызов ошибки, он будет собирать любую дичь абсолютно.
Можно например в структуре сделать кучу переменных с одинаковыми именами, компилятор будет просто каждый раз обращаться к первой.
Технически здесь нет никакой ошибки. Но для юзера - есть.
Добавлено 06-05-2022 в 10:02:
Я вам характерный примерчег приведу.
Я уже упоминал, что при инициализации членов класса можно через двоеточие задавать кол-во бит, которые будут использоваться не для выравнивания структуры, как в настоящем языке, а как подсказка для сейв-рестора и передачи по сети. Выглядит это вот так, ну вы знаете:
C++ Source Code:
1
class CBaseEntity
2
{
3
string m_targetname : 16;
4
float m_health : 10;
5
unsignedint m_skin : 8;
6
};
Имена тут просто для примера, для наглядности.
А вот как выглядит код, который это парсит:
C++ Source Code:
1
if( CheckToken( ":" ))
2
{
3
if( m_immediateType != type_integer )
4
m_lexer.Error( LEX_CONSTANT_EXP_NOT_INTEGRAL, "constant expression is not integral" );
5
else bits = m_immediate.integer;
6
7
if( bits == 0 ) m_lexer.Error( BIT_FIELD_ZERO_COUNT, "'%s' : named bit field cannot have zero width", name );
8
elseif( bits < 0 || bits > 32 )
9
m_lexer.Error( BIT_FIELD_INVALID_COUNT, "'%s' : type of bit field too small for number of bits", name );
m_lexer.Error( BIT_FIELD_INVALID_TYPE, "'%s' : bit field must have type 'int', 'float', or 'string'", name );
12
def->bits = bound( 1, bits, 32 );
13
NextToken();
14
}
Тут вызовов с ошибками больше, чем кода, который сохраняет значение в def. К тому же, например, если компилятор уровней даже на что-то ругается, он может это делать скрытно. Пока не пропишешь в командной строке параметр -dev или -debug, все эти сообщения не будут видны.
В компиляторе исходных текстов ошибки отключать нельзя в принципе.
Но как вы знаете можно сделать наоборот - превратить предупреждения в ошибки. Абсолютно разные концепции.
Ну оно и понятно. Карта соберётся с косяками и вы на них полюбуетесь в реальном времени. А если с программой начнёт происходить какая-то чертовщина, вы очень долго будете разбираться что сделали не так.
Если компилятор вам в этом не поможет. К слову сказать, в 60-е, 70-е годы, компиляторы почти ничего не находили. Иногда это приводило к срыву космических программ, например.
Готовые решения, в лучшем случае code-driven к тому же внутренние методы спрятаны от пользователя и находятся только в документации.
Для того чтобы вызвать какой-нибудь косинус в яве ты не можешь заглянуть в хидер. Либо лезть в документацию, либо помнить наезусть, либо надеяться, что тебе студия вывалит подсказку. Всё это очень неудобно.
Я пишу data-driven машинку, т.к. это общая концепция XashNT.
Добавлено 06-05-2022 в 10:30:
Поясню на примере. Когда у тебя в коде виртуальной машины есть хидеры со списком всех доступных системных, функций, ты уже можешь прикидывать что тебе понадобится для реализации. А не листать многостраничную документацию или вообще с размаху налететь на стену, узнав что такого метода просто нет, но в следующей версии появится обязательно.
Добавлено 06-05-2022 в 10:34:
Для мапперов очень хороший пример приведу. Энтити, которые есть в игре вам не видны. Вы можете только прописать их в FGD, причём FGD и реальные энтити никак не связаны. Вы можете прописать туда несуществующую энтить или наоборот - забыть прописать то, что есть.
Вот с этими виртуалками, у которых системные методы нигде не задекларированы точно такая же ситуация. Очень неудобно это.
Дядя Миша писал: Когда у тебя в коде виртуальной машины есть хидеры со списком всех доступных системных, функций, ты уже можешь прикидывать что тебе понадобится для реализации.
И как юзер будет в этом разбираться? В той же студии есть подсказки с кратким описанием методов, и что куда им скармливать.
Сегодня товарищи, знаментальный день. Я набиваю для виртуального языка системные функции, ну что-то вроде CRT. И дело дошло до функции Q_timestamp. И тут я вспомнил! Эта функция была мною написана в апреле 2007-го года (первые опыты с написанием движка начались в феравле 2007-го). Так вот я её написал, чтобы в лог сохранять дату когда движок был запущен и соответственно остановлен.
Эта функция пережила старый ксаш (ну который несовместимый ни с чем), переехала в Xash3D и оттуда разумеется попала в FWGS, затем она так же без изменений попала в XashNT и вот я делаю её частью стандарта будущего скриптового языка. И теперь миллионы людей по всему миру её увидят и будут ей пользоваться. А-ФИ-ГЕТЬ. Знал бы я какая судьба будет у этой функции, когда я её писал в апреле 2007-го года, я бы удивился и неповерил.
Пишу конвертор Delphi -> C++. Для того чтобы изучать исходники QuArK, естественно. Мне проще написать конвертор, чем забивать голову этим ублюдошным синтаксисом.
Интересно, будет ли такой конвертор нужен кому-то еще кроме меня?
Добавлено 13-05-2022 в 02:12:
Делфи изумительный язык. Мало того что его компилятор по сути стейт-машина, так в язык намеренно введены конструкции чтобы программист выполнял половину работы за компилятор.
Дядя Миша писал: Делфи изумительный язык. Мало того что его компилятор по сути стейт-машина, так в язык намеренно введены конструкции чтобы программист выполнял половину работы за компилятор.
я когда на нём писал плагины под CS 1.6 на сервак, который мы с другом держали на взломанном компе из Малайзии, помню всё время мне казалось, что это скриптовый язык какой-то, а ещё там была какая-то дурацкая фича, что сначала нужно было создать основную форму, а потом уже код писать, причём эта форма нигде даже не использовалась. Delphi7 кажись был Ж)
Добавлено 14-05-2022 в 03:38:
Цитата:
Дядя Миша писал: Мне проще написать конвертор, чем забивать голову этим ублюдошным синтаксисом.