Эксперт WindowsАвтор FAQ
17969 / 7607 / 889
Регистрация: 25.12.2011
Сообщений: 11,342
Записей в блоге: 17
1

Массив пользовательского типа - объект для хранения именованных переменных и массивов различных размерностей с максимальной скоростью доступа

29.08.2012, 00:46. Показов 9740. Ответов 8
Метки нет (Все метки)

Недавно открыл для своих целей всю мощь такого объекта.
Решил поделиться.

Цель:
максимальная скорость доступа.
минимальная нагрузка на оперативную память.
не нужно запоминать имена переменных (подсвечиваются, если поставить точку).
возможность хранить внутри каждого из индексов массива другой массив с динамически изменяющейся размерностью.
возможность быстро очистить основной массив.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Option Explicit
 
Type Lesson
    Дисциплина As String
    Аудитория As String
    Вид_занятия As String
    Преподаватель() As String
End Type
 
Sub Test()
Dim Lesson() As Lesson 'Объявляем массив пользовательских типов
Dim x As Long, y As Long
y = 1
x = 2
 
'В каждой клетке у нас много информации о дисциплине
'Поэтому будем эту информацию делить сразу и хранить в памяти в удобной форме для быстрого доступа
 
'Расширяем размерность на одну строку и 2 клетки (2 дисциплины)
ReDim Lesson(1 To y, 1 To x)
 
'Дисциплину № 1 ведут 2 преподавателя
ReDim Lesson(1, 1).Преподаватель(1 To 2)
Lesson(1, 1).Дисциплина = "Огневая"
Lesson(1, 1).Вид_занятия = "Экзамен"
Lesson(1, 1).Аудитория = "ауд.333"
Lesson(1, 1).Преподаватель(1) = "Петров"
Lesson(1, 1).Преподаватель(2) = "Сидоров"
 
'Дисциплину № 2 ведут 3 преподавателя
ReDim Lesson(1, 2).Преподаватель(1 To 3)
Lesson(1, 2).Дисциплина = "Тактика"
Lesson(1, 2).Вид_занятия = "Курсовая работа"
Lesson(1, 2).Аудитория = "ауд.111"
Lesson(1, 2).Преподаватель(1) = "Петров"
Lesson(1, 2).Преподаватель(2) = "Сидоров"
Lesson(1, 2).Преподаватель(3) = "Иванов"
 
'Изменяем размерность подмассива
Stop 
ReDim Preserve Lesson(1, 2).Преподаватель(1 To 2) 'Test OK
'Изменяем размерность главного массива
Stop 
ReDim Preserve Lesson(1 To 1, 1 To 1) 'Test OK
'очистка подмассива
Stop
Erase Lesson(1, 1).Преподаватель 'Test OK
'очистка главного массива
Stop
Erase Lesson 'Test OK
Stop
Поправьте меня, если для моих целей есть другой, более подходящий объект.
2
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2012, 00:46
Ответы с готовыми решениями:

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

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

Массив: Создать массив для хранения различных символов...
Нужно создать массив для хранения различных символов (буквы и различные знаки) Необходимо узнать...

Как создать список класса CList для хранения переменных типа int?
Как создать список класса CList для хранения переменных типа int?

8
Модератор
Эксперт функциональных языков программированияЭксперт Python
34198 / 19092 / 4018
Регистрация: 12.02.2012
Сообщений: 31,979
Записей в блоге: 13
29.08.2012, 07:43 2
Все верно... У пользовательских структур в VB только один недостаток: их трудно передать объекту как параметр (в метод или свойство). А в остальном - все так.
0
15134 / 6408 / 1730
Регистрация: 24.09.2011
Сообщений: 9,999
29.08.2012, 13:04 3
Цитата Сообщение от Dragokas Посмотреть сообщение
Цель:
максимальная скорость доступа.
Если так, то более подходящего объекта нет.
А вообще, альтернативой является класс. Известный авторитет Ч. Пирсон сравнивает пользовательский тип с классом и находит преимущества класса:
http://www.cpearson.com/excel/classes.aspx
1
Эксперт WindowsАвтор FAQ
17969 / 7607 / 889
Регистрация: 25.12.2011
Сообщений: 11,342
Записей в блоге: 17
29.08.2012, 13:11  [ТС] 4
Catstail, продемонстрируйте, пожалуйта, ошибки при попытке такой передачи.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
34198 / 19092 / 4018
Регистрация: 12.02.2012
Сообщений: 31,979
Записей в блоге: 13
29.08.2012, 15:22 5
Я немного виноват. Для VBA мое замечание не актуально. Но если попробовать сделать ActiveX-dll, у класса которой есть метод с UDT-параметром, то возникнут проблемы. См. прилагаемый проект
Вложения
Тип файла: zip t019.zip (1.1 Кб, 16 просмотров)
0
1024 / 227 / 21
Регистрация: 20.05.2016
Сообщений: 971
Записей в блоге: 19
02.06.2016, 13:10 6
К сожалению пользовательский тип (особенно заметно на массивах) имеет ограничение, с моей точки зрения - серьезное:
"Хотя на уровне модуля размер переменной пользовательского типа ограничен 64 К, размер переменных пользовательского типа в процедурах не может превышать 32 К"

Добавлено через 2 минуты
И это общий размер, если их три, значит по 10К... а это всего ли 2500 элементов типа Long к примеру.
0
Эксперт WindowsАвтор FAQ
17969 / 7607 / 889
Регистрация: 25.12.2011
Сообщений: 11,342
Записей в блоге: 17
02.06.2016, 15:26  [ТС] 7
Значит скорее всего, что-то не так с разработкой архитектуры приложения.
Например, стоит воспользоваться базой данных, либо хранить в массиве пользовательского типа только указатели на строки / массивы....

Добавлено через 9 минут
Достаточно объявлять не-фиксированные строки и динамические массивы, тогда поля структуры будут содержать только указатели на данные:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Type User_Type
    l_arr() As Long
    s_var As String
End Type
 
Private Sub Form_Load()
    Dim UT() As User_Type
    ReDim UT(0)
    
    With UT(0)
        ReDim .l_arr(1000)
        .s_var = String$(1000, 0)
    End With
    
    Debug.Print LenB(UT(0))
End Sub
8
0
1024 / 227 / 21
Регистрация: 20.05.2016
Сообщений: 971
Записей в блоге: 19
02.06.2016, 17:27 8
Данные ограничения всплыли и рассматривались в контексте реализации арифметики длинных (больших) чисел - VBA. В результате пришлось использовать массивы, вместо пользовательской функции, что увеличило время обработки примерно в 2 раза.
0
1024 / 227 / 21
Регистрация: 20.05.2016
Сообщений: 971
Записей в блоге: 19
06.06.2016, 14:12 9
Dragokas, Вы правы, с динамическими массивами это ограничение не срабатывает. Принял к сведению.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2016, 14:12
Помогаю со студенческими работами здесь

Как правильно объявить двумерный массив для пользовательского типа
Схема: Есть такой "базовый" Type: Private Type Linii Tip As Byte 'направление вектора...

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

Как привести объект пользовательского типа к заданному встроенному типу?
Добрый вечер, у меня есть класс: ref class MessageClass { public: char *senderName;...

Как передать в коллекцию объект класса или пользовательского типа?
Встречаю две взаимоисключающие ошибки: В модуле класса PublicNonCreatable "Supplies" ...

Ввод именованных переменных
Задача: написать код программы, чтобы при вводе в консоль строчных символов происходило сложение...

Создать двумерный динамический массив для переменных произвольного типа
это часть кода. сначала создал 2д массив для интов- все работало. но мне сказали сделать так чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru