Нда, чудеса... Не прошло и вечности, как индеец Зоркий Глаз заметил, что пример из инструкции по структурам:
не компилится потому что структуры без меток не перевариваются (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
Все любят гипножабу
Ну так на то он и Зоркий глаз Видимо, когда читал тот твой пост, думал, что уж мне-то структуры никогда не понадобятся.
Пока накопал только, что структуры, похоже, были прикостылены сбоку. Поскольку отрабатываются в той же процедуре, что и метки. Подумаю ща как сделать их в человечьем виде.
---------- 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;
Последний раз редактировалось Alex Rider; 06.01.2015 в 21:03.
Если есть желание - лучше не к автору взывать, а создать свой репозитарий, клонировав авторский или какой-либо иной с sjasm+ на github и затем внести в него желаемую правку.
На деле sjasm+ очень бажный и написан в лучших традициях. Замечу, что оригинальный sjasm не прибегает к лучшим традициям, но в нем нет нужных модных фич.
Не согласен. Если каждый для затычки очередного бага будет клонировать репозитарий, то наплодится куча неполноценных бажных никому не нужных версий. Жеоательно все же фиксы рассовывать в существующие репозитарии.
"Качеством" тамошнего кода я очень проникся. Особенно, с учетом того, что чтобы понять как сделать фикс на 10 строк пришлось продебажить кучу всего и въехать в работу этого "кучи всего".
Предлагаю Витамину добавить тебя в коммитеры своей репы.
Излишне. C++ я знаю в режиме "read-only", так что саппортить не буду все равно. Тут я напрягся потому что ахтунг совсем возник - без структур дизасм саботера пришлось бы переделывать чуть более, чем весь. Если что и буду еще править, проще сюда сложить, хозяева живых бранчей растащат если им оно надо.
---------- Post added at 00:25 ---------- Previous post was at 00:21 ----------
Олсо у меня нет VS2010 и тем более неWindows. Есть VS2013, но выкладывать в public правки, сделанные в ней, я слегка очкую.
Тады пусь сабж сам померджит кот и вылажыт.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)