· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Динамический массив структур данных

Посл.отвђт Сообщенiе


Дата: Ноя 4, 2003 02:21:25

И еще такой вопрос: есть некая структура, например, такая:
SOMESTRUCT struct
Param1 dd ?
Param2 dd ?
Param3 dd ?
Param4 dd ?
SOMESTRUCT ends
Предполагается использование динамического массива таких структур, т.е. в любой момент количество элементов массива(а не элементов самой структуры) может уменьшиться или увеличиться. Как такое реализовывается?
Есть у кого-нибудь примеры или ссылки на такой материал?


Дата: Ноя 4, 2003 04:01:33

а не проще объявит труктуру так:
1. Params dd столько-то dup (?) - если знаешь сколько максимум будет элементов
2. Params dd ? - указатель на димамически изменяемый массив данных

обращаться так
Lea ESI, [EBP+EDX*4] ;EBP - указатель; EDX - элемент
LodsD ;считать данные элемента


Дата: Ноя 4, 2003 05:28:24

Создаёш переменную, которая указывает на последнюю существующую структуру и переменную указывающую на последнюю заполненную структуру при добавлении новой структуры проверяеш достаточно ли памяти, если нет то выделяеш ещё памяти (добавлять лучше память на несколько структур) под структуры. Можно в структуру добавить две переменные: адрес предыдущей структуры и адрес следующей структуры, если адрес предыдущей равен нулю, значит эта структура первая, если адрес следующей равен нулю, значит последняя.


Дата: Ноя 4, 2003 17:06:46

hopeless

Твой материал называется списком, т.е., структурой вида:
SOMESTRUCT struct 
Param1 dd ? 
Param2 dd ? 
Param3 dd ? 
Param4 dd ? 
Next dd 0
SOMESTRUCT ends 


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


Дата: Ноя 4, 2003 18:14:30

volodya
Лист, конечно, неплохо, но при большом количестве елементов - страдает скорость кода. Причина: елементы листа не лежат 'рядом', как в массиве. При доступе получается большая вероятность Page Faults.
===
Это дело можно улучшить - выделяя сразу много елементов в одном куске памяти и когда нужен новый елемент - просто назначаем его из этого массива. Если елемент удаляется - помечаем его как свободный для применения в этом же листе.
===


Дата: Ноя 4, 2003 19:06:51

AsmGuru62

Это уже тоже обсуждалось - см. пример с realloc, приведенный bcl_lcz в топике о сортировке в алгоритмах.

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

А вообще, лучше тогда, бинарное дерево. Оно не страдает недостатками списка, который, я, кстати, тоже не люблю. Пусть возмет сбалансированное деревце и все.


Дата: Ноя 4, 2003 19:57:22

volodya
Дерево не лучше и не хуже списка. Выбор дерева или списка (или вообще другой структуры) зависит от конкретной задачи. Например, деревья идеально подходят для быстрого поиска, зато списки проще сбрасывать/подгружать в файл. Кстати, сбалансировать дерево - задачка ещё та :-)
IMO, если человек (hopeless) со структурами сталкивается впервые, то пусть уж лучше сначала разберётся с односвязным списком.


Дата: Ноя 4, 2003 22:32:42

Quantum
Оки-доки. Читаем Ника Паланте в разделе "Классика" - что в "Документы".

Список читается так:
узел = указатель на начало списка;
while(узел)
{

 узел = узел->next;
}


Дата: Ноя 6, 2003 19:05:15

volodya
Что-то не нашел доков про списки/деревья и realloc(что меня особенно интересует). Можно прямой линк?


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.072