Дескриптор перед динамическим массивом при печати структуры?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
vbStr
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 04.04.2005 (Пн) 20:18

Дескриптор перед динамическим массивом при печати структуры?

Сообщение vbStr » 16.08.2005 (Вт) 21:22

Привет всем!
Есть код:

Код: Выделить всё
Public Type SubStr
    nx As Single
    ny As Single
    txy As Single
End Type

Public Type BasicStr
    Untitled01 As Long
    Untitled02 As Long
    Untitled03 As Integer
    Untitled04 As Integer
    Untitled05 As Integer
       
    SubMassiv() As SubStr
End Type



Sub AdvancedGetting()

Dim i As Long, j As Long
Dim Result() As BasicStr
Dim FileNumber As Integer

FileNumber = FreeFile
Open "C:\test.bnr" For Binary As #FileNumber

For i = 1 To 15
    ReDim Preserve Result(1 To i)
    ReDim Result(i).Submassiv(1 To 5)
    Get #FileNumber, 1 + (i - 1) * 84, Result(i)
    Next i
Close #FileNumber

End Sub


Этим кодом считывается бинарный файл структура которого известна (см. BasicStr): информация в файле идет блоками по 84 байт. Последение 60 байт - это динамический массив со структурой SubStr. Первые 14 из оставшихся в начале 24 байт предназанчены для Untitled0*, оставшиеся 10, как предполагается, расходуются на дескриптор, который (оператор Put) 2 + 8 * число_размерностей_динамическоего_массива, т.е. 2 + 8 * 1 = 10.
Все логично! Но оператор Get отказывается корректно считывать данные из файла. Значения переменных Untitled0* считываются верно, а массивы не только не заполняются, а даже очищаются, как после использования Erase.
Кроме того, если не указать конкретно номер байта с которого нужно считывать данные, то уже на второй проходке цикла появляется ошибка Out of Memory.
В чем может быть причина? Размер этого дескриптора одинаков для всех языков программирования или различается?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 17.08.2005 (Ср) 0:23

В режиме Binary никакие дескрипторы не распознаются, Get считает файл одним большим байтовым массивом и читает все подряд. Если хочешь прочесть что-то в массив в таком режиме - сделай ему ReDim заранее.

vbStr
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 04.04.2005 (Пн) 20:18

Сообщение vbStr » 17.08.2005 (Ср) 7:24

Ennor писал(а):В режиме Binary никакие дескрипторы не распознаются

Ennor, массив, которым я считываю данные является пользовательской структурой. Help по VB (оператро Get, для Binary), говорит, что при чтении любых массивов, кроме являющихся элементами типов, определяемых пользователем, инструкция Get считывает только данные. Дескриптор не считывается. Где истина?

Ennor писал(а):Если хочешь прочесть что-то в массив в таком режиме - сделай ему ReDim заранее.

Точных данных по размеру массива перед началом массива нет. В этом бинарнике могут лежать данные, имеющие различную структуру. Порядок произвольный...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 43

    TopList