8. Массивы



Автор: WildCat

Массив - это всего лишь группа переменных одного типа, объединенных общим названием и различающихся индексом - порядковым номером элемента. Рассмотрим, например, номера домов на улице:



Мы создаём массив переменных Integer, каждая из которых помнит "свой" номер дома. Объявлется массив очень просто, так же, как и переменные:

Dim Housenr(10) as Integer

Теперь посмотрим, можно ли положить в ячейку памяти имя владельца дома вместо номера:



Такой массив объявляется так:

Dim Owner(10) as String*4

Используя тот же индекс, мы можем получить имя владельца, равно как и номер его дома.

Dim Index as Integer
For Index = 1 to 10
Print "Housenumber: " ; Housenr(Index)
Print "Owner: " ; Owner(Index)
Next Index

Заметьте, в BASCOM нумерация элементов массива всегда начинается с 1, а не с 0, как это делается во многих других компиляторах.
Тип переменной Index может быть любым, кроме Bit, Single и Double.

Данные
Выражение DATA служит для хранения неизменяемых данных в программной памяти. Они не съедят драгоценные байты оперативной памяти, где хранятся переменные. Хранить тут можно любые виды информации. Как только она потребуется, она может быть считана в переменную при помощи операторов Read или Restore. Учтите, тип переменной должен совпадать с типом хранящихся данных! Оператору DATA должна предшествовать метка с названием блока данных. Допустим, у нас есть 4 байта для управления какой-нибудь микросхемы:

IC1codes:
DATA &H09;, &H77;, &H14;, &H23;

Эти данные мы считаем в массив вот так:

Dim IC1code(4) as Byte
Dim Codeindex as Byte
Restore IC1codes
For Codeindex = 1 to 4
Read IC1code(Codeindex)
Next Codeindex

У нас может быть несколько наборов команд в различных блоках данных с различными метками, и мы можем считывать их в массив в нужный момент, экономя таким образом место в оперативной памяти.
Обратите внимание:

Можно извлечь из блока данных нужное значение с помощью функции Lookup. она возвращает из списка Data значение с указанным порядковым номером (аналогично массивам).

Dim ICode as Byte
Dim Codeindex as Byte
...
Codeindex = 3
ICode = Lookup(Codeindex, IC1codes)

В этом примере функция вернёт третий код из блока данных IC1codes (&H14;), и он будет присвоен переменной ICode.
Lookupstr делает то же самое для строк:

Dim Owner as String*4
Dim Ownerindex as Integer
...
Ownerindex = 2
Owner = Lookupstr(Ownerindex, Owners)
...
...
Owners:
Data "Witn", "Jero", "Wiel", ...

Переменной Owner будет присвоено второе по списку значение "Jero".

Обратную функцию выполняет Lookdown. Она возвращает позицию указанной строки в блоке данных:

Dim Calval as Byte
Dim Calindex as Byte
Calval = 102
Calindex = Lookdown(Calval, ADCcalibration, 10)
...
...
ADCcalibration:
Data 17, 24, 47, 75, 102, 201, 435...

Получим значение Calindex=5. Lookdown должна знать число элементов в блоке данных (в нашем случае 10), чтобы она смогла найти нужное значение. (Lookdown вроде бы работает только с данными типа byte)



DECADALAB ALFA