Как объявить строковый элемент любого диапазона внутри пользовательского типа в QBasic?

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

Однако мой компилятор выдает исключение "Ожидаемая STRING * on..." для этого примера. Тест-кейс, определяющий длину строки:

TYPE Person
    name AS STRING * 4
END TYPE

DIM Matheus AS Person:
Matheus.name = "Matheus":

PRINT Matheus.name:

Он записывает «Математика», ожидаемый «Матеус». Есть ли способ разрешить любой диапазон для этой строки?

Примечание. Я использую компилятор QB64.


person Klaider    schedule 02.11.2016    source источник


Ответы (1)


Нет, нет способа использовать строку переменной длины, даже с QB64. Вы можете заглянуть в FreeBASIC, если вам нужна эта функция, поскольку она ее предлагает.

TYPE создает тип записи с указанными полями, а записи имеют фиксированную длину. Посмотрите на спецификацию OPEN ... FOR RANDOM:

OPEN Filename$ FOR RANDOM AS #1 [LEN = recordlength%]
  • recordlength% определяется путем получения LEN переменной TYPE или оператора FIELD.
  • Если в операторе OPEN не используется длина записи, размер записи по умолчанию составляет 128 байт, за исключением последней записи.
  • Длина записи не может превышать 32767, иначе произойдет ошибка!

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

QB64 не убрал это ограничение, вероятно, чтобы сохранить совместимость со старым кодом QBASIC, поскольку первоначальной целью было сохранить совместимость.

person Community    schedule 03.11.2016
comment
Если вы понимаете, как данные структурированы в памяти, вы можете перегрузить дополнительные данные, загрузив данные в адрес указателя переменной. Вы не сможете получить доступ ко всем данным обычными средствами, но если вы можете отслеживать указатели перегруженных переменных в массиве, вы можете обойти ограничение (вроде). - person Robert Talada; 25.04.2017