Тема: Отладка
Показать сообщение отдельно
Старый 12.01.2006, 14:34   #8
AsmLover
 
Сообщений: n/a
Тут отладчик вообще ни при чем.
Ты просто загоняешь компьютер в исполнение бесконечного цикла. Строки ниже команды безусловного перехода GOTO никогда не выполнятся, поэтому требуется вмешательство по принудительному останову программы. То есть твоя программа на самом деле такая:
Graphics 800,600,16,2
.start
x=1
Repeat
  Cls
  x=x+1
  x=y^2
  Goto start
Forever
Я просто добавил комплементарную пару к Repeat (т.е. Forever), чтобы программа работала.
Крайне редко бывает смысл входить в бесконечный цикл без возможности выхода из него. В данном случае смысла нет никакого, поэтому добавим возможность в теле бесконечного цикла выход пор нажатию клавиши ESC:
Graphics 800,600,16,2
.start
x=1
Repeat
  Cls
  x=x+1
  x=y^2
  If KeyHit(1) End
  Goto start
Forever
Теперь все будет работать и не виснуть. И от отладчика это не зависит.
Отладчик просто добавляет в исполняемый файл дополнительную информацию - таблицы с символьными именами функций и переменных, номера исходных строк и некоторую другую.

Пара замечаний по коду г-на Zanoza.
На Ассемблере такие конструкции встречаются очень часто. Но на языках высокого уровня их надо избегать, если Вы не представляете точно, чего хотите добиться от программы. Если необходимо программным способом выйти из цикла или блока, то в Блитце есть специальная команда EXIT, корректно выводящая на верхний уровень вложенности (то есть если у Вас три вложенных цикла, например, то для выхода в основное тело программы нужно использовать EXIT в каждом цикле). Это связано с тем, что можно попасть в ситуацию, когда итоговый ассемблерный код цикла реализован не c помощью метки входа и команд условного или безусловного перехода на эту метку, а через запоминание на стеке адреса первой команды после цикла и перехода на него командой возврата после завершения работы цикла, восстанавливающей исходное состояние стека. В последнем случае при выходе из тела цикла из его середины на стеке останется лишнее значение, что наверняка приведет к краху программы.

Но поскольку в исходном коде пересекаются два цикла :
.start .... GOTO start и
Repeat .... Until KeyHit(1),

то пришлось бы использовать Exit два раза. Проще в данном случае включить проверку на нажати ESC перед входом в цикл.

Поэтому свой очень полезный код г-н Zanoza должен был написать так:

Graphics 800,600,16,2
.start

x=1

While Not KeyHit(1)
  Cls
  x=x+1
  x=y^2
  Goto start
  Text 10,10,x
  Flip
Wend

End
Разумеется, и в этом случае команды после Goto никогда не выполнятся (слава Богу, автор не так много кода сгенерировал после этого - спасибо за это).
 
Ответить с цитированием