Важная информация

User Tag List

Страница 1 из 5 12345 ПоследняяПоследняя
Показано с 1 по 10 из 44

Тема: Нашел новый баг в бейсике

  1. #1
    Master
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    880
    Благодарностей: 470
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Wink Нашел новый баг в бейсике

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

    Этот баг заключается в том, что остаток строки после 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 не заканчивается двоеточием.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Master Аватар для [bETA]mEN
    Регистрация
    16.01.2005
    Адрес
    Moscow
    Сообщений
    668
    Благодарностей: 113
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    IT FOUND A VOICE... NOW IT NEEDS A BODY

  4. #3

  5. #4
    Banned
    Регистрация
    07.01.2006
    Адрес
    г. Москва
    Сообщений
    3,442
    Благодарностей: 278
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    30 REM: NEXT i: PRINT "Ku-ku!": STOP
    К разделителю операторов ":" это (REM) не относится, ибо как ты разделишь REM от других операторов?...

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

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

  6. #5
    Guru Аватар для goodboy
    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    9,450
    Благодарностей: 3168
    Записей в дневнике
    1
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Клон Посмотреть сообщение
    P.S. В 48 бейсике если двоеточие не ввести, то и операторы ты не напечатаешь, так как курсор будет литерный "L", а не командный "K".
    почему же ??? после REM вводим THEN и курсор в K режиме. после ввода нужных команд THEN можно спокойно удалить.

  7. #6
    Banned
    Регистрация
    07.01.2006
    Адрес
    г. Москва
    Сообщений
    3,442
    Благодарностей: 278
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от goodboy Посмотреть сообщение
    почему же ??? после REM вводим THEN и курсор в K режиме. после ввода нужных команд THEN можно спокойно удалить.
    И что это даст?

  8. #7
    Guru Аватар для goodboy
    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    9,450
    Благодарностей: 3168
    Записей в дневнике
    1
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  9. #8
    Veteran Аватар для Лас
    Регистрация
    18.11.2008
    Адрес
    пос.Полярный, ЯНАО
    Сообщений
    1,062
    Благодарностей: 780
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

  10. #9
    Master
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    880
    Благодарностей: 470
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

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

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

    Добавлено через 3 минуты
    Цитата Сообщение от [bETA
    mEN;177633]э.... а такой пример:
    RANDOMIZE USR 15619: REM: LOAD "name" CODE
    Так команду LOAD выполняет TR-DOS, и вообще это не чисто бейсик, а с вызовом подпрограммы в кодах (15619), которая манипулирует состоянием интерпретатора. Я вел речь о совсем другом случае - когда бейсик "чистый", и никакая пользовательская программа в кодах им не манипулирует.
    Последний раз редактировалось Barmaley_m; 19.01.2009 в 15:40. Причина: Добавлено сообщение

  11. #10
    Banned Аватар для Black_Cat
    Регистрация
    15.06.2006
    Адрес
    S.Pb
    Сообщений
    5,646
    Благодарностей: 231
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

Страница 1 из 5 12345 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Небольшие программки на Бейсике.
    от new в разделе Для начинающих
    Ответов: 11
    Последнее: 17.07.2010, 13:45
  2. Ответов: 5
    Последнее: 03.09.2007, 00:34
  3. Border-эффект на Бейсике
    от jim в разделе Разное
    Ответов: 7
    Последнее: 18.04.2007, 19:50
  4. Багу нашёл!
    от fk0 в разделе Форум
    Ответов: 7
    Последнее: 15.04.2007, 05:45
  5. Ответов: 3
    Последнее: 06.09.2005, 12:08

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •