Возможно ли создание изменяющейся структуры (UDT)?

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

Возможно ли создание изменяющейся структуры (UDT)?

Сообщение vbStr » 11.08.2005 (Чт) 20:25

Всем привет!
Пусть есть некоторая сложная структура:
Код: Выделить всё
' Вложенная структура
Public Type MySubType
    untitled_1 As Long
    untitled_2 As Long
    untitled_3 As Long
End Type

' Основная структура
Public Type MyMainType
    Dim MyUDTD1 As Byte
    Dim MyUDTD2 As Integer
    Dim MyUDTD3() As MySubType
End Type


:?: Возможна ли вообще такая структура, в которой хотя бы один
из элементов - MyUDTD3() - массив, размер которого определяется в процессе выполнения кода? Спасибо.

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

Сообщение Ennor » 11.08.2005 (Чт) 22:57

Вроде не припомню таких ограничений, должно работать. А что, не работает?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.08.2005 (Пт) 1:09

Конечно не работает.
Потому что не надо dim внутри type.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Ennor » 12.08.2005 (Пт) 11:16

:shock:
:lol:

GSerg, ну ты и глазастик... :)

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

Сообщение vbStr » 12.08.2005 (Пт) 18:24

GSerg! А что можно придумать? Я читаю бинарник некоторого приложения, структура которого мне известна, но она изменяется каждый раз в зависимости от задачи, решаемой приложением. Точнее определенная "шапка" структуры не меняется, а число элементов массива, о котором говорилось выше, может быть переменным.
Уже замучился: использую кучу структур, циклов и проч. Получается очень много дублирующего кода различающегося буквально несколькими символами :( .

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.08.2005 (Сб) 5:01

vbStr писал(а):А что можно придумать?

Dim сотри.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение vbStr » 13.08.2005 (Сб) 16:54

GSerg писал(а):
vbStr писал(а):А что можно придумать?

Dim сотри.


Gserg, точно! Когда я поднимал тему, то во внешеней структуре указал Dim. Это моя ошибка/опечатка. Возможно, я несколько неточно сформулировал свой вопрос, а опечатка еще более усугубила положение. Итак, есть две структуры:

Код: Выделить всё
' Вложенная структура
Public Type MySubType
    untitled_1 As Long
    untitled_2 As Long
    untitled_3 As Long
End Type

' Основная структура
Public Type MyMainType
    MyUDTD1 As Byte
    MyUDTD2 As Integer
    MyUDTD3() As MySubType
End Type


Есть необходимость считать данные из бинарного файла при помощи такого сложного пользовательского типа. Сложность заключается в том, что один из элементов внешней структуры { см. MyUDTD3() } является динамическим массивом (размерность его заранее не определена!), каждая ячейка которого имеет структуру, также описанную пользователем { см. - MySubType }. Вот!
:?: №1. Возможно ли такое нагромождение вообще в Vbasic? Если, невозможно, то возникает другой вопрос.
:?: №2. Приложение, чьи бинарные файлы считывает мое приложение, к этим файлам также обращается и корректно распознает зашифрованные данные. Как так?
Задачка хитрая. Единственная зацепка, которую я не могу использовать вот какая. В процессе работы того стороннего приложения, которое создает эти бинарные файлы, ведется протокол действий. Первая же строчка протокола говорит о том, что программа генерирует форматы данных. :?: Это как? Сама описывает структуру своих данных? Разве эта структура не определена заранее?
GSerg! Если не лень вникать в то, что в этом postе написано, объясни, пожалуйста.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.08.2005 (Вс) 3:34

1. Да
2. ЧТо значит зашифрованные?
Потом вообще ничего не понял.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение vbStr » 14.08.2005 (Вс) 17:39

Код: Выделить всё
' Вложенная структура
Public Type MySubType
    untitled_1 As Long
    untitled_2 As Long
    untitled_3 As Long
End Type

' Основная структура
Public Type MyMainType
    MyUDTD1 As Byte
    MyUDTD2 As Integer
    MyUDTD3() As MySubType
End Type


GSerg!

1. Ты хочешь сказать, что переопределять массив MyUDTD3() можно? Тогда в каком месте кода нужно писать Redim для этого массива? Внутри структуры нельзя...

2. Термин "зашифрованные файлы" применительно к бинарным файлам, наверное, не очень удачно подобран. Дело в том, что я в эти вещи погружаюсь впервые и у меня до сих пор при открытии таких файлов Блокнотом создается впечатление, что файл зашифрован :wink: . Конечно же, это обыкновенные бинарники, в которых в определенном порядке лежат числа.
Попытаюсь еще раз объястнить проблему. Допустим программа выкидывает 5 блоков информации, для которых предусмотрена структура, подобная той, которая приведена выше.
В каждом блоке первые два числа (5 байт) всегда есть два числа (5 байт) (своеобразная "шапка" для всей остальной информации из блока). Число последующих байт переменно: может быть 12, 24, 36, 48 и т.д. (см. внутреннюю структуру), естественно, оно кратно числу элементов во внутренней структуре (т.е. 12). Пусть для некоторой задачи оно равно 4 х (4 х 3) = 48. Тогда для того, чтобы получить структуру, подходящую для этой задачи, нужно где-то переопределить MyUDTD3() от 1 до 4. Где это нужно сделать?

3. Над третим вопросом, наверное, не следует ломать голову. На словах трудно объяснить.

Спасибо за помощь!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.08.2005 (Вс) 17:46

dim s as MyMainType
redim s.MyUDTD3(1 to 4)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение vbStr » 14.08.2005 (Вс) 18:20

GSerg писал(а):dim s as MyMainType
redim s.MyUDTD3(1 to 4)

Лаконично :? ! Но я постараюсь разобараться. В твоем ответе я увидел что-то новенькое. Благодарю за совет, GSerg!

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

Сообщение vbStr » 14.08.2005 (Вс) 19:31

GSerg! Разобрался с твоей подсказкой. Решил использовать такой код:

Код: Выделить всё
Option Explicit

Private Type SubStructure
    nx As Single
    ny As Single
    txy As Single
    mx As Single
    my As Single
    mxy As Single
End Type

Private Type BasicStructure
    FirstCell As Long
    SecondCell As Long
    TrirdCell As Byte
    Massiv() As SubStructure
End Type

Sub GoIntoBinary()

Dim GlobalMassiv() As BasicStructure

Dim i As Integer
Dim FileNumber As Integer
Dim temp As BasicStructure

FileNumber = FreeFile

Open "D:\VisualBasic\VBProjects\misc.bnr" For Binary As #FileNumber

For i = 1 To 4
    ReDim Preserve GlobalMassiv(1 To i)
    ReDim GlobalMassiv(i).Massiv(1 To 3)
    Get #FileNumber, , GlobalMassiv(i)
Next i

End Sub


Все работает до строчки
Код: Выделить всё
Get #FileNumber, , GlobalMassiv(i)
где появляется ошибка Out of memory (Error 7)! В чем может быть причина? Справка говорит, что такая ошибка появляется в нескольких случаях: открыто слишком много приложений, модуль слишком большой и проч. Ни под одно из этих условий код не подпадает...

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 14.08.2005 (Вс) 22:12

У тебя GlobalMassiv какого типа? BasicStructure :) А VB что рассчитывает получить? :)
Нет меня больше

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.08.2005 (Вс) 22:41

Использовать Input вместо Get? :)

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

Сообщение vbStr » 15.08.2005 (Пн) 8:08

A.A.Z. писал(а):У тебя GlobalMassiv какого типа? BasicStructure :) А VB что рассчитывает получить? :)

A.A.Z., что значит "VB что рассчитывает получить?". Я хочу в каждую ячейку массива GlobalMassiv, имеющего структуру BasicStructure, считать информацию.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 15.08.2005 (Пн) 13:29

В каком формате данные хранятся?
Нет меня больше

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.08.2005 (Пн) 13:38

A.A.Z. писал(а):В каком формате данные хранятся?

http://bbs.vbstreets.ru/viewtopic.php?p=143001#143001
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение vbStr » 15.08.2005 (Пн) 19:21

Amed писал(а):Использовать Input вместо Get? :)


Amed, синтаксис Input# предполагает занесение считанных данных в список переменных, а мне нужно считать информацию в массив.


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

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

Сейчас этот форум просматривают: AhrefsBot, SemrushBot, Yandex-бот и гости: 28

    TopList