Вход

Просмотр полной версии : Нашел новый баг в бейсике



Barmaley_m
18.01.2009, 17:28
Если кто коллекционирует баги в синклер-бейсике - то вот им для полноты коллекции еще один, найденный мною :)

Этот баг заключается в том, что остаток строки после REM бейсиком должен игнорироваться, однако в некоторых случаях он не игнорируется, а выполняется.

Знание этого бага будет особенно полезно тем, кто смешивает код на бейсике и на ассемблере (размещая его в REM).

Ситуации таких три: NEXT, DATA и DEF FN.

Например, запустив программу:

10 FOR i=10 TO 1
20 PRINT "Skipped loop"
30 REM: NEXT i: PRINT "Ku-ku!": STOP
40 NEXT i
50 PRINT "Correct"

Получим сообщение:
Ku-ku
9 STOP statement, 30:4

----

Пример с DATA:

10 REM: DATA "Ku-ku!"
20 DATA "Correct"
30 READ a$: PRINT a$

В результате работы программы получится "Ku-ku!"

---------

Пример с DEF FN:

10 REM: DEF FN a(x)=0
20 PRINT FN a(0)

Вместо сообщения "P FN without DEF, 20:1" программа выведет сообщение "Q Parameter error, 20:1".

--------

Я когда-то точно нашел в прошивке бейсика, где находится и как можно пофиксить этот баг. Сейчас уже забыл, но примерно помню, что там есть процедура поиска оператора (вызывается во всех вышеперечисленных случаях), и эта процедура не учитывает, что оператор REM не заканчивается двоеточием.

[bETA]mEN
18.01.2009, 18:00
э.... а такой пример:
RANDOMIZE USR 15619: REM: LOAD "name" CODE

:v2_laugh:

Vitamin
18.01.2009, 18:02
10 REM zzz : PRINT "kuku"

что выдаст?

Addison
18.01.2009, 21:03
30 REM: NEXT i: PRINT "Ku-ku!": STOP

К разделителю операторов ":" это (REM) не относится, ибо как ты разделишь REM от других операторов?...

Убери двоеточие после REM и не будет никаких багов, а так ты сам интерпретатору сообщаешь, что с REM харе, давай другой оператор интерпретируй... :v2_lol:

P.S. В 48 бейсике если двоеточие не ввести, то и операторы ты не напечатаешь, так как курсор будет литерный "L", а не командный "K". Наверное поэтому, Бармалей и поставил двоеточие, а когда он его поставил, он оператору REM подписал смертный приговор :D. Я уж по заголовку темы подумал и правда чего-то накопали.

goodboy
18.01.2009, 22:36
P.S. В 48 бейсике если двоеточие не ввести, то и операторы ты не напечатаешь, так как курсор будет литерный "L", а не командный "K".

почему же ??? после REM вводим THEN и курсор в K режиме. после ввода нужных команд THEN можно спокойно удалить.

Addison
18.01.2009, 23:36
почему же ??? после REM вводим THEN и курсор в K режиме. после ввода нужных команд THEN можно спокойно удалить.
И что это даст?

goodboy
19.01.2009, 00:14
всего лишь опровергнет твоё утверждение о том что без `:` оператор не напечатаешь.

Лас
19.01.2009, 00:25
Убери двоеточие после REM и не будет никаких багов, а так ты сам интерпретатору сообщаешь, что с REM харе, давай другой оператор интерпретируй... :v2_lol:
---skip----
Я уж по заголовку темы подумал и правда чего-то накопали.
Клон неправ два раза:
10 REM: PRINT : PRINT "ku-ku" - ничего напечатано не будет, хоть присутствует несколько двоеточий.
И, действительно, топикстартер накопал небольшой баг.

PS. Клон, ты бы сначала реал свой включил или эмуль запустил бы. Проверил бы. А потом уже кидался в атаку. :wink:

Barmaley_m
19.01.2009, 15:37
Убери двоеточие после REM и не будет никаких багов, а так ты сам интерпретатору сообщаешь, что с REM харе, давай другой оператор интерпретируй...

Ты почитай внимательно документацию к Бейсику, там черным по белому сказано, что интерпретатор ИГНОРИРУЕТ все, что стоит в строке после оператора REM, в том числе если там имеются двоеточия!

И действительно, он это делает, как уже показал Лас в своем примере. Я нашел случай, когда он этого не делает, что есть баг!

Двоеточие после REM необходимо, иначе мой баг не сработает. Связано это с тем, что процедура поиска оператора (в которой баг и находится) считает, что оператор REM заканчивается двоеточием - хотя на самом деле он им не заканчивается. Но между REM и двоеточием может стоять что угодно, это на баг не повлияет.

Интересных эффектов можно добиться, если поставить после REM какие-нибудь операторы с числовыми константами и вызвать с помощью бага (NEXT) их к выполнению. Аналогично DEF FN - без специальных приемов нельзя создать DEF FN функцию после REM.

Добавлено через 3 минуты

mEN;177633]э.... а такой пример:
RANDOMIZE USR 15619: REM: LOAD "name" CODE

Так команду LOAD выполняет TR-DOS, и вообще это не чисто бейсик, а с вызовом подпрограммы в кодах (15619), которая манипулирует состоянием интерпретатора. Я вел речь о совсем другом случае - когда бейсик "чистый", и никакая пользовательская программа в кодах им не манипулирует.

Black_Cat
19.01.2009, 15:45
Barmaley_m, вывод-то какой? Патч будет? Т.е. исправленная ПЗУ будет?

psb
19.01.2009, 16:24
Патч будет?
а это-то еще нафига?

Black_Cat
19.01.2009, 16:31
а нафига ошибки искать, если их не править?

Barmaley_m
19.01.2009, 17:14
а нафига ошибки искать, если их не править?

во-первых, я ее специально не искал, а наткнулся случайно, когда экспериментировал с бейсиком. Хотел получить сообщение "I FOR without NEXT", закомментировал оператор NEXT, а желаемого сообщения об ошибке не получил. Потом уже стал исследовать, нашел причину ошибки и то, что она относится не только к NEXT, а еще и к DATA и DEF FN.

Во-вторых, зачем теперь исправлять ошибку, если она сильно не мешает, а людей сейчас пользуются бейсиком мало? Я вон сделал Bogobasic, в нем много расширений и ошибок исправлено - а толку? Стал кто-то применять улучшенную работу с каналами и потоками? Улучшенный CIRCLE? Помогли кому-то исправленные баги? Скорее наоборот. Некоторые защиты вызывают подпрограммы из ПЗУ. Например, в одной защите, помнится, вызывалась подпрограмма "LINE". В Bogobasic изменена процедура рисования точки, поэтому процедура LINE выполняется за другое число тактов - это влияет на содержимое регистра R, и защита не работает.

В Bogobasic были другие, очень полезные функции, типа @LOAD"file" и расш. драйвер клавиатуры - поэтому я все-таки предпочел иметь его в ПЗУ. Однако я не по наслышке знаю, Black_Cat, чем чреваты изменения бейсика.

Практически не существует "безопасных" мест в ПЗУ, которые можно безнаказанно менять. Всегда найдется программа, которая перестанет из-за этого работать.

Black_Cat
19.01.2009, 17:48
Практически не существует "безопасных" мест в ПЗУ, которые можно безнаказанно менять. Всегда найдется программа, которая перестанет из-за этого работать.это понятно, для этого обычно делают теневой исправленный ROM, в котором исправлены все ошибки найденные когда-либов ПЗУ. Т.к. такое ПЗУ уже существует, то почему бы не исправить ещё один баг. А что касательно Bogobasic, то тут вопрос больше в рекламе продукта и его соответствии современным требованиям

Addison
19.01.2009, 18:01
Вообще это нельзя считать в полной мере багом, так как после REM подразумевается использовать литеры, зачем туда лепить операторы или, допустим, вперед ставить ":"? Зачем провоцировать интерпретатор на ошибку? Ну не может программист учесть все глупости, которые захотят сделать извращенцы...
Можно возразить только тем, что за ремом иногда код вставляют, и он теоретически может быть таким, как привел примеры Бармалей. Но и здесь я вам скажу: "Нафиг это делать?" Код в бейсик программу можно вставить и более корректными способами. Такими извратами можно любой интерпретатор за яйца схватить. Вот только надо ли это делать?

Barmaley_m
19.01.2009, 19:09
Клон, я не совсем пойму твою мотивацию к этому спору, конечно... Вопрос выеденного яйца не стоит, а такую дискуссию развели.

Я считаю, что это баг, потому что:

1. Во всех документациях к бейсикам, которые я в жизни встречал, всегда остаток строки после REM игнорируется независимо от наличия в нем двоеточий.
2. Синклер-бейсик ведет себя непоследовательно. В одном случае (при обычных обстоятельствах) он игнорирует все, что после рем, а в другом (NEXT, DATA, DEF FN) - нет.
3. В случае, когда бейсик не игнорирует операторы после REM (NEXT), то неправильно отрабатываются числовые константы.
4. Операторы после REM - это вполне нормальная ситуация, когда программист хочет "закомментировать" часть программы. Именно так я наткнулся на этот баг в первую очередь. Я не баги в бейсике искал, а рассчитывал, что бейсик проигнорирует закомментированный NEXT. Между прочим, это заняло некоторое время - чтобы разобраться, что происходит.
5. В бейсике-128 токены после REM могут быть, если загрузить программу, набранную в бейсике-48. И при выполнении такой программы эффекты будут те же.

Barmaley_m
19.01.2009, 19:38
Если ты ремаришь то и пиши буквами, зачем тебе токены? Тогда и двоеточия у тебя не будет,

Я уже объяснял (пост №21, п.4), как именно у меня возникла ситуация, что после REM оказались токены, двоеточия и NEXT. Это вполне нормальный сценарий использования бейсика: закомментировать строку с помощью REM. Двоеточие перед NEXT там возникло из-за того, что NEXT не был первым в последовательности закомментированных операторов. Перед первым я двоеточия не ставил.


Мотивация такая же, как и у тебя, когда ты создавал эту тему.

Очень странная и нелогичная мысль. Я создавал эту тему для того, чтобы сообщить людям о новом баге в бейсике. Ты, ведя дискуссию в этой ветке, о новых багах бейсика не сообщал, следовательно у тебя совершенно иная мотивация, чем у меня.

Barmaley_m
19.01.2009, 20:20
Оператор REM предназначен для введения пояснений к программе, ты его используешь неправильно

Почему неправильно? Я могу комментировать программу как угодно, не так ли? Любым текстом, который можно ввести с клавиатуры, не применяя оператор POKE. В том числе я могу использовать токены. Или это где-то запрещено?

И если заявлено, что бейсик, для того, чтобы реализовать назначение оператора REM, игнорирует любой текст после него - а на самом деле этого не делает - то что это, как не баг?

Barmaley_m
19.01.2009, 20:24
Для проявления бага достаточно наличия последовательности ":NEXT" после REM. Если программист специально не стремится получить осмысленную демонстрацию бага, а наткнется на него случайно, то скорее всего получит сообщение "C Nonsense in BASIC", но даже это является ненормальным, особенно если после такого комментария стоит "законный" оператор NEXT.

И использования комментариев (в любом языке программирования) с целью временного отключения кусков кода - это настолько давно возникшая практика, что предусматривается при разработке интерпретаторов и компиляторов.

goodboy
19.01.2009, 20:31
наверняка этот текст поможет разобраться. ftp://ftp.worldofspectrum.org/pub/sinclair/books/CompleteSpectrumROMDisassemblyThe.txt
обработка REM с #1BB2

Addison
19.01.2009, 20:32
то что это, как не баг?
По большому счету баг.


В том числе я могу использовать токены. Или это где-то запрещено?
Если ты не будешь извращаться, то после REM ты по наставлению интерпретатора будешь вводить литеры. Чтобы его наколоть, ты ставишь разделитель ":", объясни зачем ты это делаешь?
Если ты считаешь, что разрешено ремарить готовые строки, то вызывай строку на редактирование, ставь в начало курсор, жми rem, потом вводи, если не выдаст ошибку, то я рад за тебя, пользуйся, если интерпретатор выдаст ошибку, значит ремаринье строк штатно не было задумано.
В 48к я не пробовал, в 128к ремаринье работает, тот пример, который я приводил ранее с DATA, я проверил, ввел сначала строку без рем, при этом набрал буквами data, затем при вводе «оно» исправилось на токен DATA, после чего я вызвал на редактирование и заремарил. Программа штатно работала, бага не было, можешь проверить.

Добавлено через 1 минуту

И использования комментариев (в любом языке программирования) с целью временного отключения кусков кода - это настолько давно возникшая практика, что предусматривается при разработке интерпретаторов и компиляторов.
но бейсик 48к очень давно делался...

Добавлено через 2 минуты

я наглядно объяснил как можно напечатать - вот и всё

Зачем, ведь понятно было, что речь идет о штатном наборе. Зачем флуд разводить?
Эта поправка из разряда ненужных.

goodboy
19.01.2009, 20:39
ведь понятно было, что речь идет о штатном наборе.

извини я не понимаю что такое штатный набор ??? какие критерии ???

Addison
19.01.2009, 20:43
с целью временного отключения кусков кода
Куски кода всегда отключались при помощи введения дополнительной строки goto. Для интерпретатора - это логичнее, просто перескакиваешь. А так как ты написал обычно делают в компиляторах, там и оператора такого нет, просто в скобки фигурные берешь и всё...

Добавлено через 1 минуту

какие критерии ???
хотя бы не набирать ненужные токены только ради того, чтобы сменить курсор.
Курсор либо сам меняется, либо его меняют нажатием специальных клавишь, думаю ты знаешь, как это делается.

Добавлено через 9 минут

В 48к я не пробовал
Попробовал, спокойно все ремариться, не нужно просто лепить двоеточие.
Бармалей, ты просто провоцируешь интерпритатор на ошибку, иногда бейсик это двоеточие кушает...

Barmaley_m
19.01.2009, 21:13
Клон - я тут заметил, что ты довольно причудливым образом меняешь свое мнение. Поначалу (при первом прочтении сообщения) ты говорил вот это:


Цитата:
Сообщение от Barmaley_m
И использования комментариев (в любом языке программирования) с целью временного отключения кусков кода - это настолько давно возникшая практика, что предусматривается при разработке интерпретаторов и компиляторов.

но бейсик 48к очень давно делался...



Цитата:
Сообщение от Barmaley_m
то что это, как не баг?

По большому счету баг.

---

А потом (видимо, когда удалось "выжать" новые аргументы), ты сказал:


Куски кода всегда отключались при помощи введения дополнительной строки goto. Для интерпретатора - это логичнее, просто перескакиваешь. А так как ты написал обычно делают в компиляторах, там и оператора такого нет, просто в скобки фигурные берешь и всё...

---

Это выдает, что твое внутреннее убеждение не сходится с той позицией, которую ты отстаиваешь ("что найденный мною баг - не баг"). А споришь ты, по-видимому, ради самого процесса. Ну-ну :)

Addison
19.01.2009, 21:26
что ты довольно причудливым образом меняешь свое мнение
Правильно, потому что я разбираюсь в этой проблеме вместе с тобой.
Я не являюсь большим знатоком бейсика, как например, ГудБой, он все знает.
Я знаю только то, что прочитал когда-то в детстве в руководстве по бейсику и еще в некоторых книжка, да и еще поделенное это на забывчивость.
Это форум, живое обсуждение. Цель здесь не показать, что я все знаю, а кто-то ничего не знает. Я лично не боюсь ошибиться, как некоторые тут...

Я тебе писал одно, полагая, что возможно в Спековском бейсике REM ввели только для непосредственно ремарок. Но потом я попробовал и убедился, что строчку можно заремарить и немного изменил свой взгляд на эту проблему. Что тут плохого?
Плохо когда люди деревянные и настаивают на своем, даже когда уже поняли, что сто раз неправы. Я к таким не отношусь, такие буратинки далеко не уходят. Я легко меняю свою точку зрения, если встречаю разумные, доходчивые аргументы.

Barmaley_m
19.01.2009, 21:27
Посмотрев по ссылке на "полный дизассемблер ПЗУ", я могу вам сказать, где она находится. Вот в этой процедуре:

THE 'LOOK-PROG' SUBROUTINE
This subroutine is used to find occurrences of either DATA, DEF FN or NEXT. On entry the appropriate token code is in the E register and the HL register pair points to the start of the search area.

1D86 LOOK-PROG

Или, более детально, в процедуре 198B EACH-STMT, которая перебирает операторы в строке (разделенные двоеточием) и не учитывает, что если найден оператор REM, то надо возвращаться без анализа остатка строки.

Все случаи вызова EACH-STMT, кроме тех, что в LOOK-PROG, не могут привести к "перескоку" за оператор REM потому, что номер искомого оператора берется не с потолка, а с текущей позиции выполнения (например, в случае CONTINUE и RETURN). Так что если управление изначально "не залетело за REM", то оно туда и не попадет (кроме LOOK-PROG) и еще двух случаев, описываемых ниже.

Допустим, программа была прервана в середине строки. Если отредактировать эту строку, поставив первым в ней оператор REM, то вызов CONTINUE приведет к выполнению операторов, что стоят после REM, разделенных двоеточиями.

Аналогичного эффекта можно добиться, если отредактировать строку, содержащую оператор GO SUB. Выполнение RETURN в этом случае может привести к выполнению кода после REM.

Недаром во многих бейсиках ("АГАТ", "РК-86", "Специалист") оператор CONTINUE блокировался после редактирования программы. Также можно предположить (я не проверял), что принудительно очищался стек GO SUB.

Addison
19.01.2009, 21:40
На счет бага понятно, что баг.
Просто ты не задавался вопросом, почему его раньше никто не обнаружил.
Просто никто так не изгалялся над REMом. Совсем не ясно, зачем было лепить двоеточие, я бы такое делать никогда бы не стал. Конечно, у всех своя психология, я люблю, чтобы все было штатно по накатанной колее, надежно по правилам. Некоторые наоборот любят поизвращаться, поэтому находят кучу багов и возятся с ним. Я оператором REM вообще никогда не пользуюсь, ибо пишу так, что все понятно без пояснений, бейсик достаточно простой язык и вполне читаем. А если уж ремарить, то делать это тоже по-человечески буквами. Если отключать строки, то вызывать на редактирование и ставить в начале оператор. В порядке залог успеха в любом деле.

Black_Cat
19.01.2009, 21:42
Barmaley_m, ну а патч-то придумаешь?

Addison
19.01.2009, 21:49
Допустим, программа была прервана в середине строки. Если отредактировать эту строку, поставив первым в ней оператор REM, то вызов CONTINUE приведет к выполнению операторов, что стоят после REM, разделенных двоеточиями.

Аналогичного эффекта можно добиться, если отредактировать строку, содержащую оператор GO SUB. Выполнение RETURN в этом случае может привести к выполнению кода после REM.
Это косвенно подтверждает предположение, что авторы бейсика не предполагали использовать оператор REM для заремариванья строк, чтобы их временно отключать. Этот оператор был сделан именно для написания пояснений к программе.
Поэтому недокументированное использование оператора приводит к недокументированным эффектам.

Barmaley_m
19.01.2009, 22:01
Barmaley_m, ну а патч-то придумаешь?
Мне лень, да и не надо это никому. Кто сейчас пишет на синклер-бейсике?

Если хочешь - сам сделай патч, я тебе очень точно указал на то место в ПЗУ, где находится баг. Который проявляется уже не в трех, как я изначально писал, а в пяти случаях (NEXT, DATA, DEF FN, CONTINUE, RETURN).

Добавлено через 5 минут

Это косвенно подтверждает предположение, что авторы бейсика не предполагали использовать оператор REM для заремариванья строк, чтобы их временно отключать. Этот оператор был сделан именно для написания пояснений к программе.

Я думаю, что по этим данным нельзя делать выводы о намерениях авторов. Ведь если оператор REM просто обнаруживается по ходу выполнения программы, то остаток строки игнорируется полностью, несмотря на наличие в нем двоеточий и токенов. Аналогично, после числовых констант не вставляются их двоичные "теневые копии". То есть в этих двух ситуациях оператор REM отрабатывается правильно независимо от того, поставлен ли он с целью закомментировать строку, или содержит просто текст.

К тому же было бы нелогично для создателей бейсика как-то специально ограничивать область применения оператора REM, без всяких на то причин.

Addison
19.01.2009, 22:12
Кто сейчас пишет на синклер-бейсике?
Пишут некоторые, простые программки.
Но заплатка вряд ли нужна.
Ты как оцениваешь сильно придется менять процедуру? Ведь любое изменение кода ПЗУ черева-то потерей совместимости с софтом, ведь он обращается туда по определенным адресам. И еще есть стандартная таблица векторов прерываний. Например, в ZX+3 в прошивке 48к безобидно пустые байты в ПЗУ (FF) прошили нулями. Из-за этого некоторые игры не идут, так как там расположен вектор прерываний, и он неправильно формируется. Казалось бы безобидная правка... Возможно, это вызвано просто строением ПЗУ, у которой по умолчанию вместо FF - нули и там где ее не шили, они остались, я честно больше ничего не смог придумать в объяснение этого нововведения в прошивке 48к для zx+3.

Barmaley_m
19.01.2009, 22:15
Просто никто так не изгалялся над REMом. Совсем не ясно, зачем было лепить двоеточие, я бы такое делать никогда бы не стал. Конечно, у всех своя психология, я люблю, чтобы все было штатно по накатанной колее, надежно по правилам

Я тоже делал все "надежно и по правилам" (пост №21, п.4), но наткнулся на баг. Соблюдение правил и опора только на документированные возможности не дает никаких гарантий на будущее - хотя многим кажется, что дает.

Конечно, чрезмерная опора на "инсайдерские знания" и недокументированные возможности тоже ни к чему хорошему не приведет. Для хороших результатов в программировании нужен баланс обоих подходов, и здравый смысл, и как можно больше информации.

Добавлено через 12 минут

Но заплатка вряд ли нужна.
Ты как оцениваешь сильно придется менять процедуру? Ведь любое изменение кода ПЗУ черева-то потерей совместимости с софтом, ведь он обращается туда по определенным адресам. И еще есть стандартная таблица векторов прерываний

Совершенно с тобой согласен. По моим оценкам, изменений нужно совсем немного: добавить проверку на токен "REM" и условный возврат. Это три байта, в лучшем случае. "на месте" их нет, поэтому придется добывать где-то в свободных областях, лепить переходы (3 байта на штуку)...

Кроме тех причин потери совместимости, что ты описал, есть еще одна: выполнение этих подпрограмм бейсика будет иметь в результате другое значение регистра R, что может привести к потере работоспособности ксорок.

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

Addison
19.01.2009, 22:58
Я тоже делал все "надежно и по правилам" (пост №21, п.4), но наткнулся на баг.
Вот залез в фирменное описание бейсика для модели 48к.
Там приводят классический пример:

10 REM temperature conversion
20 PRINT "deg F", "deg C"
30 PRINT
40 INPUT "Enter deg F", F
50 PRINT F,(F-32)*5/9
60 GO TO 40


You will need to type the words in line 10. Also, although GO TO has a space in it, it is really all one keyword (on G).

Now run it. You will see the headings printed on the screen by line 20, but what happened to line 10? Apparently the computer has completely ignored it. Well, it has. REM in line 10 stands for remark, or reminder, and is there solely to remind you of what the program does. A REM command consists of REM followed by anything you like, and the computer will ignore it right up to the end of the line.

Для тех кому лень переводить скажу, что про REM там написано, что этот оператор нужен только для того, чтобы напомнить о чем программа. Этим примером все сказано. Использование этого оператора для отладки - это выдумки пытливого ума программиста, клоторые возможно потом стали нормной, но не в 1982 году...

Больше оператору REM там внимания не уделяют.

ram_scan
20.01.2009, 07:03
Вот залез в фирменное описание бейсика для модели 48к.
Там приводят классический пример:

[вырезано]

A REM command consists of REM followed by anything you like, and the computer will ignore it right up to the end of the line.

Для тех кому лень переводить скажу, что про REM там написано, что этот оператор нужен только для того, чтобы напомнить о чем программа. Этим примером все сказано. Использование этого оператора для отладки - это выдумки пытливого ума программиста, клоторые возможно потом стали нормной, но не в 1982 году...

Больше оператору REM там внимания не уделяют.

Там уделено достаточно внимания. Или вам таки перевести anything you like ? Вот в документации написано, что оператор REM нужен для того чтобы я написал там "все что я хочу". И что все что я захотел написать после REM будет проигнорировано. Безо всяких фантазий что в операторе REM надо писать "о чем программа". Вы в документации видите то что хочется, а не то что там там написано.

Как программист пользуется оператором REM - сугубо его личное дело.

Addison
20.01.2009, 17:29
что оператор REM нужен для того чтобы я написал там "все что я хочу".

Речь идет о пояснительном тексте, а не об вводе операторов.
Там написано, что это памятка или пометка, читай внимательно.


REM in line 10 stands for remark, or reminder, and is there solely to remind you of what the program does


Никакого отношения к отладке этот оператор не имеет.
И доказательством этого является найденный баг. Ты думаешь программист, который писал интерпретатор никак его не тестил? Элементарно бы это всплыло, если бы заремарили пару строк программы. Next довольно часто используется. Да и почему никто этот баг не пофиксил, ведь это не первое издание прошивки?
Я думаю дело тут в том, что на бейсике давно никто не пишет, а Бармалей фактически вернулся к нему с навыками, которые он приобрел при написании в других языках СИ, Паскале, на современном Бейсике, где использование ремарок для отладки давно вошло в моду.

Lethargeek
20.01.2009, 21:48
Никакого отношения к отладке этот оператор не имеет.
Ага. Этот оператор. В 10 строке этой конкретной программы.
О чем там собс-но английским языком и написано :D

Addison
20.01.2009, 22:44
Ага. Этот оператор. В 10 строке этой конкретной программы.
О чем там собс-но английским языком и написано
Да понятно это, что же ты всех за дураков держишь?
Ты почитай фирменное руководство по бейсику оно все на примерах написано. Для группы операторов, в которую входит REM приводится этот пример. Более этого примера этому оператору внимания в описании не уделяют. Если бы авторы планировали использовать этот оператор для отладки, то они бы об этом написали там, где дают рекомендации по отладке написанных программ.

Если ты такой вумный, найди русскую или английскую книжку, где более подробно написано как пользоваться Спеколвским REMмом. Покажи мне, где написано (рекомендовано) его использовать для отладки программы. Если ты его используешь на свое усмотрение, то и не плачь, что лезут всякие недокументированные нелепости. Ежу ясно, если авторами бейсика это не предполагалось, то и не факт, что это будет коррекно работать. То что в русских переводах пишут, что можно писать что угодно, так это имеется ввиду, что можно написать «попка дурак», а можно «программа перевода температуры» бейсику на это будет наплевать.
Ремарки в любых языках предназначены для организации пометок и пояснения кусков программы для улучшения читаемости листинга. Этому учат в школе на информатике. А то, что кто-то придумал так отлаживать программы – это его проблемы и его выдумки. Таких хитростей может быть миллион. Можно использовать GOTO, можно переименовывать строки, чтобы они прыгали вверх и запускать начиная с 100-й, можно делать простые подпрограммки, потом использовать Merge для объединения. Короче на сколько у тебя фантазии хватит. ГудБой вон вообще токен умудряется ввести там, где это никак не было задумано и получает от этого какой-то полезный для него эффект.
Короче все это проблемы юзверов, но они никак не могут предъявлять претензии, что при этом возникают какие-то баги. Если рем использовать по назначению никакого бага не будет. После введения REM курсор переключается в литерный «L» - это говорит тупым ёжикам, что от них ждет интерпретатор. Не забывайте что это не просто бейсик – это обучающий бейсик для чайников и там за вас уже тысячу раз подумали.

Lethargeek
20.01.2009, 22:55
Частный случай:

REM in line 10 stands for remark, or reminder, and is there solely to remind you of what the program does.

Общее описание:

A REM command consists of REM followed by anything you like, and the computer will ignore it right up to the end of the line.

Все, вопрос закрыт :v2_tong2:

Addison
20.01.2009, 23:23
followed by anything you like
и что это есть рекомендации использовать этот оператор для отключения действующих строк?
Здесь есть проблема, но она совсем другого характера.
Например, я хочу написать следующий коментарий:

10 REM Color: Red, Blue, Green

После ввода двоеточия у меня возникнут проблемы, так как курсор переключится в командный и вместо R я получу RUN. Это есть непродумка, этот бейсик настолько убогий с этой системой курсоров и токенов, что элементарные вещи в лоб не получаются. При вводе текста в кавычках, например, в операторе PRINT такой проблемы нет. Почему после REMа не аннулировать функцию разделителя операторов для двоеточия? В этом случае и бага бы не было и не повадно было бы лепить операторы в REMе.

В 128 бейсике я показывал (http://zx.pk.ru/showpost.php?p=177948&postcount=16), что там оператор REM реализован корректно.
Если ты введешь REM, то все остальное воспринимается текстом, можешь там упечататься двоеточиями, операторами, функциями - все это будет текст!!!

Lethargeek
21.01.2009, 02:27
и что это есть рекомендации использовать этот оператор для отключения действующих строк?
Ты ведь не понимаешь, чем "рекомендация" отличается от "инструкции" итп :rolleyes:
Описание там четкое и недвусмысленное, и если оператор так не работает - это баг и есть!

К твоему сведению - официально Синклер не стал чинить в 48K прошивке никаких багов вообще (хотя многие из них стали известны довольно скоро). Якобы чтобы не ухудшать совместимость. Возможно, просто лениво было :)


Почему после REMа не аннулировать функцию разделителя операторов для двоеточия?
А вот как раз "это косвенно подтверждает предположение" (c) :v2_tong2: что REM предполагалось использовать при отладке для временного отключения кусков программы - каковой прием стал стандартным для любого бейсик-интерпретатора задолго до 1982 года.

Лас
23.01.2009, 00:18
Клон, с тобой спорить бесполезно - ты печатаешь быстрее.

ЗЫ: Простите за оффтоп. ;-)

GriV
24.01.2009, 08:54
Тебя прощу.
А остальные - без перехода на личности! И без флуда! Буду наказывать!

VELESOFT
25.01.2009, 13:54
10 FOR i=10 TO 1
20 REM : NEXT i: PRINT 48
30 PRINT 128

this basic program show 2x 128 :v2_conf2:

DDp
25.01.2009, 15:34
...this basic program show 2x 128
Хе-хе, действительно!

А вот это:

10 FOR i=10 TO 1
20 REM : NEXT i : PRINT 48
270:::: PRINT 128
Выводит:
4.8233806E-35
128
128

(Так и есть) Различная интерпретация строки строковым редактором (после нажатия Enter) и собственно исполнителем (run-time).
Плюс баг: PRINT ищет #0E, игнорируя #0D.