ZX-Ревю 1991 №6 1990 г.

Маленькие хитрости - Так сложилось, что экономия памяти стала основной темой этого раздела. По-видимому, это как раз тот вопрос, в котором без хитростей не обойтись.


МАЛЕНЬКИЕ ХИТРОСТИ

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

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

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

Какие же программы в первую очередь нуждаются в "хитростях"? В первую очередь текстовые, а именно:

- адвентюрные игры;

- обучающие программы;

- деловые игры.

То есть, это программы с большим количеством текстовых блоков.

Рассмотрим пример: 10 PRINT "Нажмите любую клавишу".

Занимает такая строка 29 байтов в программной области Бейсика (PROG) и ничего не занимает в области Бейсик-переменных (VARS), но это только пока. После запуска программы всякий раз, когда Вы будете выполнять эту строку, в области VARS под нее будет расходоваться память.

Если Вы предполагаете использовать ее не один раз, то можете поступить так:

Сбросьте программу - NEW, а затем наберите LET а$="нажмите любую клавишу".

Если теперь Вы дадите команду LIST, то не получите ничего и это не удивительно, ведь у Вас нет никакой программы.

Теперь наберите: 10 PRINT а$

а затем дайте прямую команду GO TO 10 и Вы увидите, как Ваше сообщение появится на экране. Волшебство? Нисколько! Просто Ваше сообщение находится в области переменных и хранится там в переменной a$. В области VARS оно занимает 24 байта, а в области PROG всего 8, т.е. в сумме 32 - Вы сэкономили 21 байт.

Если бы вместо GO TO 10 Вы использовали RUN, то получили бы сообщение "VARIABLE NOT FOUND", потому как RUN очищает область программных переменных. Работая таким образом, Вы обязаны использовать GO TO и более того, если в программе есть переменные, содержащиеся только в области VARS, то выгружать ее можно только с номером строки автостарта, чтобы она сама стартовала без необходимости давать RUN.

Кстати, такой прием позволяет немного сбить с толку малоопытного, но любопытного "раскольщика". Ведь по команде LIST, которую он освоил в первый день после приобретения компьютера, он увидит далеко не всю информацию.

"Раскольщика" поопытнее можно перехитрить например другим приемом.

Скажите, пожалуйста, вооружившись всеми своими знаниями, что бы Вы подумали, увидев в первых строках программы запись типа: 10 LET start=CODE "A" 20 GO TO start

Наверное, Вы открыли бы справочник (если Вы его у нас приобрели) или хотя бы страницу 81 прошлого выпуска "ZX-РЕВЮ" и узнали бы, что код буквы A равен 65. То есть эта запись как бы эквивалентна GO TO 65. Далее Вы просмотрели бы строку 65, где настраивается вся работа программы и пошли бы по ложному пути.

Хитрость может быть например в том, что программист в 10-й строке написал вовсе не букву A, не верьте своим глазам. Это вполне может быть графический символ из графики пользователя UDG, закрепленный за клавишей А, который пока ничей от нее по образу не отличается, но имеет совсем другой код - 144, и тогда запись эта эквивалентна GO TO 144. А может быть это какой-то другой код, если он предварительно "перевесил" образ буквы "А" на клавишу "F", тогда это будет код 149.

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

А теперь рассмотрим некоторые другие приемы экономии памяти.

В своих текстовых строках Вы можете использовать управляющие символы, это такие:

CHR$ 5 - "запятая PRINT"

CHR$ 16...CHR$ 21 - цветовые атрибуты

CHR$ 8 - BACKSPACE (смещение курсора влево на одну позицию).

Пожалуй о "запятой PRINT" надо поговорить особо. Дело в том, что в наборе символов "Спектрума" существуют две запятые. Они выглядят (на экране) совершенно одинаково, но имеют разное назначение.

Во-первых, это обычная запятая, символ номер 44 (CHR$44), которая не является управляющим кодом, а просто обычным символом.

Во-вторых - это запятая оператора PRINT. Это уже управляющий код. Номер этого символа - 6 (CHR$6). Вот пример ее применения: 10 LET а = 5 20 LET b = 10 30 PRINT a,b

Вы, конечно, знаете, что делает этот управляющий код, а если не знаете, то попробуйте и увидите. Попробуйте также

30 PRINT a;b

И еще попробуйте

30 PRINT a'b

Итак, этот код дает компьютеру команду - выполнить печать на правом поле экрана, а если Вы и так на нем, то перейти на новую строку.

Кстати, напомним, что для того, чтобы просто перейти на следующую строку можно использовать символ " ' " (апостроф).

Итак, предположим, что Вам надо выдать на экран какое-то сообщение длиной более 32 символов. Вам надо строку делить, а делить как попало Вы не хотите - Вам надо это сделать в строго определенном месте.

Вариант первый - строку подбивают дополнительными пробелами (расход памяти).

Вариант второй - использовать апостроф (" ' ") - расход 3-х байтов.

Это можно сделать, если вставить CHR$6 внутрь строки, что в общем-то сделать непросто и дело вот в чем.

Предположим, Вам надо набрать: PRINT "Это первая печатная строка а это вторая".

Если Вы поставите запятую перед "а", то это будет обычная запятая (CHR$44).

Если Вы хотите вставить туда CHR$6, то пришлось бы закрывать кавычки: PRINT "Это первая печатная строка", "а это вторая".

А здесь есть расход трех байтов.

Можно, однако, этого избежать следующим путем:

- наберите

PRINT "это первая печатная строка

- перейдите в режим Е (CAPS SHIFT + SYMB SHIFT)

- держа клавишу CAPS SHIFT, нажмите "6".

Курсор приобретет желтый цвет. Это произошло потому, что Вы своими действиями ввели два управляющих кода (CHR$16 + CHR$6): CHR$16, как известно управляет цветом INK, a CHR$6 после него означает "желтый".

Нам с Вами символ CHR$6 нужен, а вот CHR$16 - нет, его надо удалить. Удалим его с помощью DELETE (CAPS SHIFT + "0") и курсор сразу "прыгнет" на другое поле. Это значит,

что код CHR$6 воспринят. А теперь закончим наше сообщение:

а это вторая"

Пока не нажимайте ENTER.

Давайте убедимся, что зазор между "строка" и "а" реально существует. Прогоните курсор влево к началу строки (CAPS SHIFT + "5") и смотрите на него. Видите, как он перепрыгнул через зазор? Вы видите этот зазор? Конечно видите, а вот для компьютера его как бы и не существует, поэтому и нет расхода памяти на заполнение пробелами этого зазора.

Теперь нажмите ENTER и давайте расстанемся до следующего выпуска, который будет большим и даст возможность рассмотреть ещё несколько приемов, связанных с внедрением в текстовую строку управляющих символов.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Форум - Программы "Пламя" и "Дракон".
От pедакции - От авторов.
На десерт - О игре DEFLEKTOR.
Вступление - Ах, вот я...
Реклама

В этот день...   20 апреля