PDA

Просмотр полной версии : Обнулить DATA в BASIC



JeRrS
15.09.2010, 16:59
0

null_device
15.09.2010, 17:07
Есть волшебная команда restore n где n - строка с данными которые будут считываться по команде read. :)

Ewgeny7
15.09.2010, 18:04
Нет. В текстовых строках "тэги" цвета входят в общую строку.
Если нужно выводить цветные буквы из строки, организуй второй массив, цифры в котором будут означать цвет. На каждую букву - по цифре :)

siril
15.09.2010, 19:44
Можно создать двумерный массив, прочитать всё в него, затем ходить по нему =)

если делать в том стиле как ты задумал надо:

10 DATA 1,7, 2,6, 3,5, 4,4, 5,3, 6,2, 7,1
30 READ B
40 READ P
50 BORDER B, PAPER P, CLS
60 READ B,P: GOTO 50

Данные для бордера и бумаги хранятся парами, друг за другом.

null_device
15.09.2010, 19:55
Проще делать это, вычисляя "полное" значение ink+paper+bright+flash. И места будет занимать будет меньше и "глобально" меняет одним оператором poke m,n в системных переменных. Для цвета border также актуально..

psb
15.09.2010, 20:50
Так и еще вопрос можно ли как то избежать ошибки если в A$ текст цветной? а то при попытки вызвать его print 0,n;a$(n+1) пишет K Invalid Color
проверять, что есть по a$(n), если там код, отвечающий за цвет, то делать потом a$(n+2). а по n+2 тоже надо проверять, не цвет ли там... т.е. можно, но сложно.

JeRrS
30.09.2010, 11:43
Еще вопрос, есть заполненная DATA, как через PRINT вызвать допустим по счету третью запись в DATA не чередовая READ с начала?

psb
30.09.2010, 11:54
если типа так:
9999 DATA 1,2,3,4,5
и ты хочешь сразу 3 получить, то по-простому никак. возможно какие-нить POKE в сист. переменные что-то и решат.

null_device
01.10.2010, 05:19
есть заполненная DATA, как через PRINT вызвать допустим по счету третью запись в DATA не чередовая READ с начала?

Расписать каждое значение (или группу) в свой оперетор data пронумеровав строки, допустим через 10. А потом вызывать их через restore n подставляя номер нужной записи (с соотв. приращением и шагом).
Вариант с хранением данных непосредственно в памяти (операторами poke\peek) более "экономичный", но геморный если понадобится что-нить поменять местами или "глобально" изменить в данных.

danner
05.10.2010, 19:38
23639/23640 "DATADD" - адрес последнего считанного оператором READ объекта данных в операторах DATA.
То есть навскидочку можно, наверное, читать первый элемент, извлекать его адрес PEEKом из этой переменной, а потом, изменив нужным образом, POKEать обратно. Числовые данные занимают по 5 байт каждое число, символы по одному. Надо поиграться, в общем ;)

---------- Post added at 18:38 ---------- Previous post was at 18:34 ----------

То есть вру, пять байт числового значения идут после записи того же числа в символах, то есть одна позиция числовых данных (с одним разрядом) занимает: байт символа + 5 байт числа + байт запятой, итого семь. А символ, соответственно, два байта (считая запятую). Так, что ли?..

psb
05.10.2010, 21:21
перед 5 байт числа еще 0E. гиблый способ.

Ewgeny7
05.10.2010, 22:01
Проще хранить и читать прямо в памяти POKE/PEEK. Читай элемент какой тебе заблагорассудится.

Titus
03.05.2011, 11:10
Хм, RESTORE восстанавливает позицию с нуля а не удаляет заполненную DATA. А как тогда удалить информацию из DATA и заполнить её в туже переменную?.
Как можно удалить что-то из DATA, если это массив КОНСТАНТ?

null_device
03.05.2011, 11:39
Через массив DIM n[$](m[, m1, m2, .. mx]) где n - имя переменных массива, $ - необязательный параметр (только для строковых переменных), m - количество переменных в массиве (если массив многомерный, добавляются параметры m1, m2, .. mx).
На практике, это может выглядеть так:

...
10 DIM A (10) ; задаем массив из 10 элементов
20 FOR I = 1 TO 10 ; организуем цикл
30 LET A (I) = RND ; заносим данные в массив
40 NEXT I ; конец цикла
...
При этом дав команду go to 20, массив (в данном случае) заполниться уже другими значениями.

---------- Post added at 15:39 ---------- Previous post was at 15:37 ----------


мне нужно чтобы предыдущие 10 заменились на другие 10. Как организовать?

Можно узнать, откуда будут браться данные для заполнения в первом и во втором случае? Если вы храните в DATA-строке глобальные переменные (положение окон, начальные данный, карты уровней и т.п.) не вижу сложности в том, что будет несколько однотипных строк, для выборки данных из которых делаем RESTORE n (где n - адрес строки с данными), а потом READ a, b, .. x. В данном случае при разных значениях n, данные a, b, .. x будут разными.
А заменять программным способом значения в троках DATA - это какой-то "китайский коммунизм"! :) Все можно организовать намного проще. Например, вот как я организовывал хранение данных об окнах в DATA-строках (см. вложение - игра сапер (http://zx.pk.ru/attachment.php?attachmentid=16429&d=1267603349)). Со строки 7000 идут блоки микропрограмм с параметром "выбора окна" (строка RESTORE n), подпрограмма для работы с данными начинается со строки 9500, сами данные расположены со строки 9900.

null_device
03.05.2011, 12:11
как не через INPUT можно заполнить массив?

Через ту же связку restore n, read n, data n. Как альтернатива, если числа целые, через PEEK n [+256*PEEK (n+1) - если число "двухбайтное"], но их нужно, все равно, предварительно как-то загрузить в память (вручную, через data-строки или с кассеты\диска).

---------- Post added at 16:09 ---------- Previous post was at 16:05 ----------


про DIM неплохая идея

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


да все очень просто, если X=1 значит такие то 10 если X=2 значит другие 10

Тогда можно использовать массив DIM A (x, n), где x - зависит от того сколько одинаковых x-наборов будет у вас, а n-количество чисел для "выборки".

---------- Post added at 16:11 ---------- Previous post was at 16:09 ----------

Внес кое-какие изменения в 19 сообщение (http://zx.pk.ru/showpost.php?p=381396&postcount=19) - перечитайте, на всякий случай..

---------- Post added at 16:11 ---------- Previous post was at 16:09 ----------

В соседней ветке (http://zx.pk.ru/showpost.php?p=381520&postcount=47) увидел новую игру, анонсированную вами. Возможно ошибаюсь, но не для нее ли вы искали алгоритм хранения данных?!
Рассмотрев листинг, пришел к выводу, что данные хранятся, несколько "неоптимально". Как массив, так и DATA-строки можно было оформить в виде символьный переменных. Тогда перенос лабиринта из строки DATA в массив можно было бы выполнить "целой строкой" READ d$: LET a$ (t)=d$, где t - это "строка", а не счетчик очередного элемента лабиринта.

null_device
17.11.2011, 16:08
Жмем клавишу а он мне его номер

В смысле, "код" нажатой клавиши (число от 32 до 164-255)? Либо, с помошью "конструкции" LET n = CODE INKEY$, либо через переменную last_k (23560), не забывая "обнулять" ее после процедуры обработки нажатия клавиши. Например так:

..
10 poke 23560,0 ; "обнуляем" переменную
20 let n = peek 23560 ; присваиваем значение
30 if not n then goto 20 ; "ждем" нажатия
40 if n = 32 then print "press space" ; обработка факта нажатия space
42 if n = 13 then print "press enter" ; обработка факта нажатия enter
50 goto 10 ; завершение "цикла"
..
----
Важно!
Таким способом можно "опрашивать" только нажатие одной клавиши. Т.е., при одновременном зажатии нескольких клавиш ни одна из них, не будет "распознана".

null_device
17.11.2011, 16:53
Если верить вашей программе получается я все IF N - ??? должен буду заполнить? от 32 до 127

Не обязательно.. данная программа проверяет нажатие двух клавиш и выводит надпись о факте их нажатия. У вас это может быть реакция для управления спрайтом\курсором и т.п.
Допустим, вам нужно определить нажатие одной из пяти клавиш (например 67890). Коды этих клавиш можно поместить в массив (или ячейки памяти) и сравнивать с ними так:


for i = 1 to 5 : read k(i) : next i
data 54, 55, 56, 58, 48
..
if n = k(1) then..
if n = k(2) then...
if n = k(3) then...
if n = k(4) then...
if n = k(5) then...
..
----
Хотя, более компактно, при использовании массива хранить значения для клавиш в "символьном" виде. Занимает меньше места в памяти и позволяет "на лету" менять "управляющие" клавиши. ;)


let k$ = "67890"
..
if chr$ n = k$(1) then..
if chr$ n = k$(2) then..
if chr$ n = k$(3) then..
if chr$ n = k$(4) then..
if chr$ n = k$(5) then.. ; либо так if n = code k$(5) then..
..
При этом для смены управляющий клавиш в программе, достаточно присвоить переменной k$ другую символьную последовательность, например let k$ = "qaopm".

---------- Post added at 20:53 ---------- Previous post was at 20:40 ----------


получается я все IF N - ??? должен буду заполнить? от 32 до 127 ?

Для "высвечивания" только кода нажатой клавиши можно поступить намного проще: :)

10 print at 0, 0; code inkey$ ;" " : goto 10
Обьясните, подробно, для чего вам нужен код нажатой клавиши?

null_device
17.11.2011, 17:12
Чтобы заполнить её в POKE. Будет последовательное нажатие и одновременное заполнение в POKE нажатых символов.

Не совсем понял? Речь о чем-то типа "програмного буфера" ввода с клавиатуры? Нэ?!
----
Если что - вся "таблица" клавиш есть в конце книжки ZX Spectrum для пользователей и прграммистов (http://vtrdos.ru/book/ZXSPECTR.ZIP)..

null_device
17.11.2011, 17:29
Так понятнее теперь?

Теперь, "допер"! :)
----
В свое время, похожим способом "учил русскому языку" музыкальный редактор WHAM!