Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Массив - как организовать? (без array и на АПИ)


Страницы:   1 2 3 4

Б. Гейтс ©   (2007-10-24 21:43:00) 

Всем привет!
Как организовать массив с помощью функций GlobalAlloc и т.п.?
Нужно, шоб в одном элементе можна было деРЖАТЬ до 256 байтов.
Работаю на чистом апи, даже array не использую!
Если честно, то даже не на паскале и не на Си.
Помогите, кто чем может!
Есть идея:
1) использовать массив DWORD'ов (кол-во пунктов - 256)
2) после использования функций Global*** хранить в пунктах адреса элементов в массиве DWORD'ов
3) в какой-нить переменной хранить кол-во элементов

Ну о-о-о-о-о-очень нужна!
Буду рад любому ответу!


Б. Гейтс   (2007-10-26 08:53:00) [41]


> Что ж... если т. Гейтс узнал из этой ветки много интересного,
>  то я был прав...

Не прав. Работаю на АПИ давно (месяц), а массивы как-то не изучал. Вот как понадобились - сразу пошел к вам.
Тока я не понял про 1-ый вариант [20]. Дайте ссыль кто-нить по этому вопросу


Юрий Зотов   (2007-10-26 00:36:00) [42]

Что ж... если т. Гейтс узнал из этой ветки много интересного, то я был прав...


Б. Гейтс   (2007-10-25 18:21:00) [43]

Ins, Dib@zol, @!!ex
Огромное спасибо за ответы!

Узнал много интересного

Очень охота поподробнее узнать про 3-ий способ. [20]
Также охота узнать про [14].


Ins   (2007-10-25 16:49:00) [44]


> Ну вообще он говорил про массив из элементов произвольной
> длины и произвольного количества. А в едином блоке без чёткой
> адресации при таком раскладе вряд ли что либо найдёшь. Не
> так ли? Нет, ну можно конечно завершающие байты расставлять,
>  но эт будет жесть искать что-либо в таком "монолите". Или
> я не прав? Тогда, в чём я ошибаюсь?

Даже так? Тогда это становится похоже на array of array т.е. массив таких вот массовов. Опять же, делаем по аналогии с тем, как это в Delphi. "Внешний" динамический массив хранит указатели на "внутренние" массивы. Только за памятью нужно будет следить аккуратно. Не забывать при сокращении размеров внешнего массива освобождать память, занятую его элементами. А при создании нового элемента соответственно память для него выделять.


Dib@zol   (2007-10-25 16:46:00) [45]

> 3) Динамический массив указателей

Звиняюсь, [21] понял...


Dib@zol   (2007-10-25 16:44:00) [46]

153 байта|25 байт|51 байт|235 байт|34 байта|... итд
Скажем, вот содержимое массива общим размером 153 + 25 + 51 + 235 + 34 байта.
Как адресовать элементы? Указывать дополнительный массив смещений, но уже с фиксированной длиной записи?


@!!ex   (2007-10-25 16:40:00) [47]

> [0] Б. Гейтс   (24.10.07 21:43)

Есть три варианта.
1) Списки
2) Динамический массив данных
3) Динамический массив указателей

1) варриант не рассматрива, мне лень объяснять.
2) выделяешь памяти столько, сколько у тебя элементов * размер элемента.
Запоминаешь указатель на первый элементы. Как вычеслять позицию i-того элемента, объяснять надо?
При изменении размера: выделяешь новый участок памяти под весь массив, копируешь туда старые данные, добавляешь новые данные, старую память осаобождаешь.
Выделяешь память, столько, сколько нужно
3) Тоже самое что и 2, только зранятся не элементы, а указатели на них. При больших размерах элементов это существенно эффективнее.

Если тебе этого объяснения мало... Чтож.. может ты рано за это взялся?


Dib@zol   (2007-10-25 16:40:00) [48]

Ну вообще он говорил про массив из элементов произвольной длины и произвольного количества. А в едином блоке без чёткой адресации при таком раскладе вряд ли что либо найдёшь. Не так ли? Нет, ну можно конечно завершающие байты расставлять, но эт будет жесть искать что-либо в таком "монолите". Или я не прав? Тогда, в чём я ошибаюсь?


Ins   (2007-10-25 16:26:00) [49]


> Dib@zol ©   (25.10.07 16:22) [16]

В массиве (автору именно он нужен) блоки размещаются в непрерывном фрагменте памяти и идут один за другим. Если размер такого массива может меняться, нужно просто перевыделить память нужного объема, когда это потребуется. Примерно так динамические массивы в Delphi и устроены (если пока забыть о некоторых других их особенностях). И никаких связанных списков.


Dib@zol   (2007-10-25 16:23:00) [50]

Про размер - GlobalReAlloc мне знаком.


Dib@zol   (2007-10-25 16:22:00) [51]

> [15] Ins ©   (25.10.07 16:21)

Именно количествоблоков, а не их размер.


Ins   (2007-10-25 16:21:00) [52]


> Dib@zol ©   (25.10.07 16:17) [14]

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


Dib@zol   (2007-10-25 16:17:00) [53]

> Забыл сказать, нужно, чтоб кол-во элементов можно было менять

Уууу... Тут могут подойти только связанные списки (если не хочешь юзать ничего из стандартных Делфей). Если не лень ждать неопределённый срок, жди когда найду время на пример. Если лень - пиши сам)))

Алгоритм таков. Есть структура

TItem = record
 Data, Prev, Next : Pointer;
end;
PItem = ^TItem;

и две переменных

FirstItem, LastItem : PItem;

В начале работы некая процедурка, скажем AddNewItem добавляет "в конец" такого импровизированного массива (сиречь в LastItem^) новый элемент, проставляя ему в Prev текущий хранящийся в LastItem адрес, а в Next - NIL. Затем (если это не первый элемент, ессно) по адресу Prev^.Next пишет адрес свежесозданной структуры. Ну и собсно резервирует память под Data и пишет туда хоть 255, хоть 65535, хоть 123456 байт.
Удаление реализуется схожим образом. А вот поиск нужного элемента - эт уже к товарисчу Гуглю обращайтесь. "Быстрый поиск в двусвязанных списках".


Германн   (2007-10-25 15:11:00) [54]

Что, Данила- мастер, не выходит каменный цветок?
:-)


Б. Гейтс   (2007-10-25 14:59:00) [55]


> Резервируешь себе ГлобалАллок-ом кусок памяти, и пишешь
> в него по смещению 256*индекс_элемента ети свои 256 байт!
>

Забыл сказать, нужно, чтоб кол-во элементов можно было менять

> Значит тебя поимели

офтоп )))


Dib@zol   (2007-10-25 14:45:00) [56]

А в чем собсно проблема??

Резервируешь себе ГлобалАллок-ом кусок памяти, и пишешь в него по смещению 256*индекс_элемента ети свои 256 байт!


Jeer   (2007-10-25 14:45:00) [57]


> результат один - не выходит!


Т.е. входит, но не выходит ?
Значит тебя поимели.


Б. Гейтс   (2007-10-25 14:38:00) [58]


> Palladin ©   (25.10.07 14:23) [8]
> программиста нормального нанимать

Нет, мне реально ответ нужен! ))
Пытался делать как в [0] и [4] - результат один - не выходит!


Palladin   (2007-10-25 14:23:00) [59]

программиста нормального нанимать


Б. Гейтс   (2007-10-25 14:21:00) [60]


> Что-то мне подсказывает, что рановато товарищ Гейтс собрался
> работать "на чистом API". Ему бы для начала понять, что
> это такое...

Ничего не рано! Время как раз то

> Ага Гейтсу надо хотя бы на бейсике покодить :)

Раньше кодил, щас пустяками не занимаюсь

Мне бы примерчик сюда. Необязательно на МАСМ, можно и на Си, но только шоб перенести можно было на МАСМ
Очень нужно, пости все мои программы должны использовать что-то типа списка строк.
Эх, хорошо в дельфи, пишешь себе SetLength и готово!
А в масме такого нет. ШО ДЕЛАТЬ?


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо