Используйте массив в определяемом пользователем ТИПЕ в QBasic

Я пытаюсь изучить QBasic для программирования на Amstrad Alt-286. В одной из своих программ я использую несколько определяемых пользователем типов, иногда массивы TYPE. В некоторых из них я хочу объявить такой массив:

TYPE TestType
    dataArray AS STRING * 4 'Since "dataArray AS _BYTE * 4" doesn't work (wrong syntax compiler says).
END TYPE

Затем я объявляю свой тип следующим образом:

DIM customType(2) AS TestType

И как только я хочу написать в dataArray моего типа вот так:

customType(1).dataArray(2) = 3

Компилятор говорит мне, что это недопустимый синтаксис.

Тогда как сохранить массив в определенном ТИПЕ? И как его использовать?


person Maxime Beasse    schedule 21.11.2018    source источник
comment
Насколько я знаю, вы не можете использовать массивы или элементы STRING переменной длины внутри TYPE. Если вам нужна функциональность, подобная массиву, QB64 предлагает тип _MEM, и вы можете определить dataArray AS _MEM. Скорее всего, вас заинтересуют функции _MEMNEW и _MEMFREE для выделения и освобождения блока памяти (см. раздел документации «См. также»). Возможно, вы захотите изучить значения полей типа _MEM с переменными разных типов, используя функцию _MEM, так как этот аспект документирован на данный момент несколько плохо.   -  person    schedule 24.11.2018
comment
@ChronoKitsune Поскольку моя программа должна работать на . Amstrad Alt-286, знаете ли вы, есть ли у типа _MEM и связанных с ним функций эквивалент в qb 4.5 или более ранних версиях?   -  person Maxime Beasse    schedule 24.11.2018
comment
К сожалению нет. Я упомянул _MEM, поскольку был добавлен тег QB64, и, насколько мне известно, вы не можете нацеливаться на Amstrad Alt-286, используя QB64. QB64 предназначен для запуска старых программ QB 4.5 на современных 32-битных и 64-битных платформах, таких как Windows, macOS/OS X и Linux. Боюсь, я не могу помочь с вашей целью, так как недостаточно знаю о ней.   -  person    schedule 24.11.2018


Ответы (2)


Здесь есть две проблемы. В QB64 вы просто не можете помещать массивы в пользовательские типы. Согласно статье QB64 Wiki об определениях TYPE:

Определения TYPE не могут содержать переменные массива! Массивы могут быть DIMensioned как определение TYPE.

Кроме того, ваш dataArray (объявленный dataArray AS STRING * 4) вообще не объявляет массив, а скорее объявляет строку из 4 символов. Вот почему вы получаете синтаксическую ошибку, когда пытаетесь получить доступ к элементам dataArray, используя синтаксис массива. Вы можете объявить массив, состоящий из пользовательского типа, например так:

TYPE TestType
    dataElement AS _BYTE
END TYPE

DIM CustomType(4) AS TestType

CustomType(1).dataElement = 3

Это объявляет массив из 4 элементов TYPE TestType, каждый элемент которого содержит переменную TYPE _BYTE. Это настолько близко, насколько вы можете приблизиться к тому, что вы пытаетесь сделать. Удачи!

person Alex V    schedule 22.11.2018

Код, который вы хотите, выглядит примерно так:

Хотя вы НЕ МОЖЕТЕ сделать это в QB1.1, QB4.5 или QB64, вы МОЖЕТЕ сделать это в надмножествах диалекта BASIC, известных как QB7.1 (BC7/PDS) и VBDOS (v1.00):

TYPE testtype
    dataArray(4) AS INTEGER
END TYPE
DIM customtype(10) AS testtype
customtype(1).dataArray(2) = 3

В противном случае вы можете сжать переменные как таковые:

TYPE testtype
    dataArray AS STRING * 8
END TYPE
DIM customtype(10) AS testtype
A = 10: B = 12: C = 14: D = 16
' compress variables into structure
element1$ = MKI$(A) + MKI$(B) + MKI$(C) + MKI$(D)
customtype(1).dataArray = element1$ ' store
' extract variables from structure
element2$ = customtype(1).dataArray ' get
E = CVI(MID$(element2$, 1, 2))
F = CVI(MID$(element2$, 3, 2))
G = CVI(MID$(element2$, 5, 2))
H = CVI(MID$(element2$, 7, 2))
PRINT E, F, G, H
person eoredson    schedule 27.01.2019