Ну как соберут и если увидишь - свистни если не трудно.
(счаз не с руки разбиратся как эти сборки делаются и т.д. - с открыткой бы успеть, а дальше сам знаешь 3д заждалось :) )
Вид для печати
Нда, чудеса... Не прошло и вечности, как индеец Зоркий Глаз заметил, что пример из инструкции по структурам:
не компилится потому что структуры без меток не перевариваются (1.07RC7). А Зоркий Глаз очень надеялся попользоваться структурами... Есть кто живой для фикса? Или самому?Цитата:
Or without label:
Код:COLORTABLE
SCOLOR 0,0,0
SCOLOR 1,2,3
SCOLOR ,2
; etc.
---------- Post added at 20:06 ---------- Previous post was at 20:03 ----------
Чот вспомнилось такое винрарное:
Цитата:
Указание начинающему программисту: Если вы с первого раза сумели написать программу, в которой транслятор не обнаружил ни одной ошибки, сообщите об этом системному программисту. Он исправит ошибки в трансляторе.
Дейстивтельно... http://zx-pk.ru/showpost.php?p=723673&postcount=1013
Ну так на то он и Зоркий глаз :D Видимо, когда читал тот твой пост, думал, что уж мне-то структуры никогда не понадобятся.
Пока накопал только, что структуры, похоже, были прикостылены сбоку. Поскольку отрабатываются в той же процедуре, что и метки. Подумаю ща как сделать их в человечьем виде.
---------- Post added at 22:00 ---------- Previous post was at 21:01 ----------
Короче, либо я не разобрался в коде SjAsm (что весьма вероятно), либо я выловил багу. В parser.cpp есть функция ParseMacro(). В ней такой кусок:
Как я понял, смысл его примерно такой: если макрос не впендюрился (результат впендюривания не 0), то выходим из функции с 0 в результате. А вот если макрос впендюрился с результатом 0, то проверяем результат на равенсто на 2 (!), если не 2, то пытаемся впендюрить структуру, но строка уже кончилась, поэтому ничего не сломается и вообще даже не случится.Код:if (!(r = MacroTable.Emit(n, p)))
{
//do none
}
else
if (r == 2)
{
return 1; //return 1
}
else
if (StructureTable.Emit(n, 0, p, gl) || !gl)
{
return 1;
};
return 0;
Я починил на такое:
Тут логика такая: если макрос впендюрился с кодом 0 или 2, то вернуть 1, иначе попробовать впендюрить структуру и вернуть 1 если получилось. На самом деле ParseMacro зовется только из ParseLine без анализа результата, так что можно хоть номер телефона из него возвращать :)Код:if (!(r = MacroTable.Emit(n, p))) {
if (r == 2){
return 1;
}
else
if (StructureTable.Emit(n, 0, p, gl)) {
lp = p;
return 1;
}
}
Я это все к чему. Я буду проверять у себя фикс на своих старых сырцах (с макросами) и на Саботере, а мой фикс неплохо бы отправить гуру во внутренностях SjAsm на предмет оценки кошерности и впиливание в репозиторий. Только я не знаю кому отправлять.
---------- Post added at 22:24 ---------- Previous post was at 22:00 ----------
Все я попутал. MacroTable.Emit возвращает 0 если не нашла макрос, 1 если ошибка в параметрах и 2 если все ok. Тогда фикс получается более такой:
Код:if (!(r = MacroTable.Emit(n, p))) {
if (StructureTable.Emit(n, 0, p, gl)){
lp = p;
return 1;
}
}
else
if (r == 2){
return 1;
}
return 0;
Если есть желание - лучше не к автору взывать, а создать свой репозитарий, клонировав авторский или какой-либо иной с sjasm+ на github и затем внести в него желаемую правку.
На деле sjasm+ очень бажный и написан в лучших традициях. Замечу, что оригинальный sjasm не прибегает к лучшим традициям, но в нем нет нужных модных фич.
Не согласен. Если каждый для затычки очередного бага будет клонировать репозитарий, то наплодится куча неполноценных бажных никому не нужных версий. Жеоательно все же фиксы рассовывать в существующие репозитарии.
"Качеством" тамошнего кода я очень проникся. Особенно, с учетом того, что чтобы понять как сделать фикс на 10 строк пришлось продебажить кучу всего и въехать в работу этого "кучи всего".
Предлагаю Витамину добавить тебя в коммитеры своей репы.
Излишне. C++ я знаю в режиме "read-only", так что саппортить не буду все равно. Тут я напрягся потому что ахтунг совсем возник - без структур дизасм саботера пришлось бы переделывать чуть более, чем весь. Если что и буду еще править, проще сюда сложить, хозяева живых бранчей растащат если им оно надо.
---------- Post added at 00:25 ---------- Previous post was at 00:21 ----------
Олсо у меня нет VS2010 и тем более неWindows. Есть VS2013, но выкладывать в public правки, сделанные в ней, я слегка очкую.
Тады пусь сабж сам померджит кот и вылажыт.