Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Чтение данных из нескольких DATA по условию.


Чтение данных из нескольких DATA по условию.

Сообщений 1 страница 10 из 10

1

Есть несколько массивов данных разной длины:

Код:
  Eff1:
  Data 6 , 254 , 254 , 254 , 254 , 253 , 253 , 253 , 253 , 247 , 247 , 247 , 247 , 127 , 127 , 127 , 127 , 251 , 251 , 251 , 251 , 191 , 191 , 191 , 191
  Eff2:
  Data 8 , 247 , 253 , 254 , 239 , 253 , 254 , 239 , 127 , 254 , 239 , 127 , 251 , 239 , 127 , 251 , 191 , 127 , 251 , 191 , 239 , 251 , 191 , 239 , 247 , 191 , 239 , 247 , 253 , 239 , 247 , 253 , 254
  Eff3:
  Data 6 , 188 , 188 , 188 , 188 , 186 , 186 , 186 , 186 , 59 , 59 , 59 , 59 , 115 , 115 , 115 , 115 , 117 , 117 , 117 , 117 , 244 , 244 , 244 , 244
  Eff4:
  Data 8 , 247 , 255 , 255 , 191 , 254 , 255 , 255 , 127 , 255 , 247 , 191 , 255 , 255 , 254 , 127 , 255 , 255 , 191 , 247 , 255 , 255 , 127 , 254 , 255 , 191 , 255 , 255 , 247 , 127 , 255 , 255 , 254
  Eff5:
  Data 4 , 251 , 239 , 251 , 239 , 239 , 251 , 239 , 251 , 253 , 239 , 253 , 239 , 239 , 253 , 239 , 253
  Eff6:
  Data 8 , 43 , 255 , 255 , 255 , 255 , 43 , 255 , 255 , 255 , 255 , 43 , 255 , 255 , 255 , 255 , 43 , 255 , 255 , 255 , 228 , 255 , 255 , 228 , 255 , 255 , 228 , 255 , 255 , 228 , 255 , 255 , 255
  Eff7:
  Data 8 , 43 , 255 , 255 , 255 , 255 , 228 , 255 , 255 , 255 , 255 , 43 , 255 , 255 , 255 , 255 , 228 , 255 , 255 , 255 , 43 , 255 , 255 , 228 , 255 , 255 , 43 , 255 , 255 , 228 , 255 , 255 , 255

.....

И такое обращение к ним:

Код:
      Select Case Poloj
            Case 1 :
            Y = Lookup(i , Eff1) : Maxstep = Lookup(0 , Eff1)
            Case 2 :
            Y = Lookup(i , Eff2) : Maxstep = Lookup(0 , Eff2)
            Case 3 :
            Y = Lookup(i , Eff3) : Maxstep = Lookup(0 , Eff3)
            Case 4 :
            Y = Lookup(i , Eff4) : Maxstep = Lookup(0 , Eff4)
            Case 5 :
            Y = Lookup(i , Eff5) : Maxstep = Lookup(0 , Eff5)
            Case 6 :
            Y = Lookup(i , Eff6) : Maxstep = Lookup(0 , Eff6)
            Case 7 :
            Y = Lookup(i , Eff7) : Maxstep = Lookup(0 , Eff7)
.....
      End Select

Таких массивов много, и они ещё будут добавляться и редактироваться.
Естественно, чтобы к ним обратиться, приходиться расширять Case.
А это увеличивает размер кода.
Объединять массивы в один нельзя!
Существует ли более элегантное решение?
Например, получить переменную с именем массива путём склеивания Eff и Poloj ?

0

2

Гибкое и "элегантное решение" - можно в первой ячейки массива всегда хранить информацию о искомом, например:

Код:
  Eff1:
  Data 1, 6 , 254 , 254 , 254 , 254 , 253 , 253 , 253 , 253 , 247 , 247 , 247 , 247 , 127 , 127 , 127 , 127 , 251 , 251 , 251 , 251 , 191 , 191 , 191 , 191
  Eff2:
  Data 2, 8 , 247 , 253 , 254 , 239 , 253 , 254 , 239 , 127 , 254 , 239 , 127 , 251 , 239 , 127 , 251 , 191 , 127 , 251 , 191 , 239 , 251 , 191 , 239 , 247 , 191 , 239 , 247 , 253 , 239 , 247 , 253 , 254
  Eff3:
  Data 3, 6 , 188 , 188 , 188 , 188 , 186 , 186 , 186 , 186 , 59 , 59 , 59 , 59 , 115 , 115 , 115 , 115 , 117 , 117 , 117 , 117 , 244 , 244 , 244 , 244
  Eff4:
  Data 4, 8 , 247 , 255 , 255 , 191 , 254 , 255 , 255 , 127 , 255 , 247 , 191 , 255 , 255 , 254 , 127 , 255 , 255 , 191 , 247 , 255 , 255 , 127 , 254 , 255 , 191 , 255 , 255 , 247 , 127 , 255 , 255 , 254
  Eff5:
  Data 5, 4 , 251 , 239 , 251 , 239 , 239 , 251 , 239 , 251 , 253 , 239 , 253 , 239 , 239 , 253 , 239 , 253
  Eff6:
  Data 6, 8 , 43 , 255 , 255 , 255 , 255 , 43 , 255 , 255 , 255 , 255 , 43 , 255 , 255 , 255 , 255 , 43 , 255 , 255 , 255 , 228 , 255 , 255 , 228 , 255 , 255 , 228 , 255 , 255 , 228 , 255 , 255 , 255
  Eff7:
  Data 7, 8 , 43 , 255 , 255 , 255 , 255 , 228 , 255 , 255 , 255 , 255 , 43 , 255 , 255 , 255 , 255 , 228 , 255 , 255 , 255 , 43 , 255 , 255 , 228 , 255 , 255 , 43 , 255 , 255 , 228 , 255 , 255 , 255

Так же можно хранить информацию и о длине массива (если нужно).
Читать такое наверное уже проще не Case-ом, а циклом перебирать.
Или аля "файловая система", из небольшого разряда информация+данные, по которым можно вообще делать один большой массив и парсить его.
В общем, делаем обычный хедар.

Отредактировано RDW (2015-03-03 11:29:16)

0

3

Хранить информацию о искомом - это понятно.
Непонятно, как в цикле обратиться ко всем  Eff1 -  EffN

Код:
For N=1 To 7
   Y = Lookup(1 , Eff - ?????)
   If Y = N Then Нашли искомый массив
Next N

0

4

(мысли в слух)
Если данные представить так: [номер данных - байт] [длина данных - байт] [данные - байт] [данные - байт]...
То код будет выглядеть так (без учета типов переменных):

Код:
Data_adr = 0
Do
     N = Lookup (Data_adr, Eff_x)
     Incr Data_adr
     L = Lookup (Data_adr, Eff_x)
     Incr Data_adr
     If N = Poloj Then
          ' тут читаем данные из массива до Data_adr + L (раз)
          ' как прочитали все данные, выходим N = 0
     Else
          Data_adr = Data_adr + L
     End If
Loop Until N = 0

Eff_x:
     Data 1 , 9 , 6 , 254 , 254 , 254 , 254 , 253 , 253 , 253 , 253
     Data 2 , 10 , 6 , 254 , 254 , 254 , 254 , 253 , 253 , 253 , 253 , 253
     Data 3 , 11 , 6 , 254 , 254 , 254 , 254 , 253 , 253 , 253 , 253 , 253 , 253
     Data 4 , 12 , 6 , 254 , 254 , 254 , 254 , 253 , 253 , 253 , 253 , 253 , 253 , 253
     Data 0 ' конец массива

Как-то так...

Отредактировано RDW (2015-03-03 13:28:01)

+1

5

Кстати вместо "Until N = 0" можно использовать "Exit Do".

0

6

RDW
Спасибо за идею, буду пробовать.
В Си такой проблемы нет, можно делать указатели и многомерные массивы.
А в баскоме приходиться костыли делать...

0

7

Мой способ хорош тем, что: не нужно в DATA привязываться к порядку + гибкая длина (в зависимости сколько нужно) + не меняется код.
Данные только добавляешь и всё.

0

8

Проверил на своём рабочем проекте. Кое что изменил, и заработало.
Естественно, код стал меньше и появилось всё то хорошее, о чем написано в предыдущем посте.

+1

9

Решил не плодить темы. Я про размещение массива данных в памяти программ. В ассемблере есть директива .org $0100 (адрес условный), который размещает массив данных по указанному адресу. Какой аналог у Васика данной директивы? Пару лет назад задавал вопрос, но потом обошлелся костылями. Сейчас потребность возникла снова.

0

10

pchela5 написал(а):

В ассемблере есть директива .org $0100 (адрес условный), который размещает массив данных по указанному адресу. Какой аналог у Васика данной директивы?


Отвечаю сам себе: методом псевдонаучного тыка обнаружил, что, если в начале программы разместить следующий код, сразу опосля $framesize :

$asm

.org &H100

Phsquare:
.db &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
.db &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
.db &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF
.db &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF

$end Asm

то интерпретатор (или все-таки компилятор?) располагает его по адресу &H100. При этом память программ до данной инструкции не используется. Поскольку FF неопределено для контроллера, надо вставить goto или rjump на саму программу.

Отредактировано pchela5 (2015-03-24 22:28:36)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Чтение данных из нескольких DATA по условию.