Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.11.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
Б. Гейтс   (2007-10-24 21:43) [0]

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

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


 
Правильный_Вася   (2007-10-24 21:49) [1]

причем тут апи?
если не паскаль и не си, то синтаксис какого языка тебе предложить?


 
Windows.Errors.Count = $FFFFFF   (2007-10-24 21:53) [2]

МАСМ \ ФАСМ и прочее...
Вот я тут подумал - форум по дельфи.
Тут все (почти) знают АПИ и поэтому я обратился к вам.


 
Б. Гейтс   (2007-10-24 21:54) [3]

Windows.Errors.Count = $FFFFFF  -  это мое альтер эго )))


 
vpbar ©   (2007-10-24 22:17) [4]

Массив - последовательность элементов. Блок в памяти - последовательность байт. Похожи?
Выделяешь память. Указатель - указатель на первый элемент. Передвигаешь указатель на размер элемента - вот и второй элемент.
В чем проблема то.


 
Юрий Зотов ©   (2007-10-25 00:10) [5]

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


 
vpbar ©   (2007-10-25 10:33) [6]

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


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


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

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

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

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

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


 
Palladin ©   (2007-10-25 14:23) [8]

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


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


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

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


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

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

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


 
Jeer ©   (2007-10-25 14:45) [11]


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


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


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


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

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

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

офтоп )))


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

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


 
Dib@zol ©   (2007-10-25 16:17) [14]

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

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

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

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

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

FirstItem, LastItem : PItem;

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


 
Ins ©   (2007-10-25 16:21) [15]


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

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


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

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

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


 
Dib@zol ©   (2007-10-25 16:23) [17]

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


 
Ins ©   (2007-10-25 16:26) [18]


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

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


 
Dib@zol ©   (2007-10-25 16:40) [19]

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


 
@!!ex ©   (2007-10-25 16:40) [20]

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

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

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

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


 
Dib@zol ©   (2007-10-25 16:44) [21]

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


 
Dib@zol ©   (2007-10-25 16:46) [22]

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

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


 
Ins ©   (2007-10-25 16:49) [23]


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

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


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

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

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

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


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

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


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


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

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


 
Ega23 ©   (2007-10-26 08:57) [27]


> Работаю на АПИ давно (месяц)


5 БАЛЛОВ!!!!!!


 
Zeqfreed ©   (2007-10-26 09:22) [28]

> Б. Гейтс   (26.10.07 08:53) [26]

Массив это базовая структура хранения информации, а никак не набор функций какого-либо API. А ты даже не понимаешь бредовости выражения «массивы на API».


 
Zeqfreed ©   (2007-10-26 09:25) [29]

> Тока я не понял про 1-ый вариант [20]. Дайте ссыль кто-нить
> по этому вопросу

http://en.wikipedia.org/wiki/Linked_list


 
Юрий Зотов ©   (2007-10-26 10:06) [30]

> Б. Гейтс   (26.10.07 08:53) [26]

Месяц - это не "давно". Это даже не "мало". Это - "практически ничто".

Доказательство - Вы даже не понимаете, что такое API; что никаких массивов там нет вообще (и быть не может); что понятие "массив" есть принадлежность языков, а не библиотек; что программировать "на чистом API" невозможно, потому что ни один вызов API нельзя сделать без использования какого-либо языка; что язык, на котором вызываются функции API абсолютно безразличен; что Ваша задача совершенно элементарна; что для ее решения надо всего лишь использовать динамическую память и указатели (организовав их в виде любой подходящей структуры); что как раз для этой задачи дельфишная RTL в 100 раз удобнее, чем WinAPI (и дает практически тот же по эффективности результат).

В общем - знаний ноль, понты одни ("пустяками не занимаюсь"). Вам программировать учиться надо, а не модными словечками кидаться.


 
Б. Гейтс   (2007-10-26 10:44) [31]


> Вам программировать учиться надо, а не модными словечками
> кидаться.

Кхе-кхе...

Знаю языки: Бейсик, Паскаль, Си (слегка)
Занимаюсь программированием: с 8-го класса (сперва Бейсик)
Что такое АПИ (мои знания): функции, экспортируемые длл мастдая (user32, gdi32, kernel32 и т.д.
Что могу на АПИ: создавать оконные приложения, сабклассировать что-нибудь, посылать сообщения
Дополнительно: слегка знаю ПЕ

Массивами раньше не занимался, работал с ними только в Паскаль, а тут на масме. На паскале мне это раз плюнуть, а в масме я с ними ни разу (!) не работал. Пришел к вам за ответом, получил его, за что некоторым огромное спасибо. Заинтересовался списками.


> Массив это базовая структура хранения информации, а никак
> не набор функций какого-либо API. А ты даже не понимаешь
> бредовости выражения «массивы на API».


Имелось в виду как используя АПИ создавать массивы без array, так как использую не паскаль, а масм.


 
@!!ex ©   (2007-10-26 10:54) [32]

> [31] Б. Гейтс   (26.10.07 10:44)

блииин. чувак.. знал бы ты, какой бред несешь....


 
Ega23 ©   (2007-10-26 10:55) [33]


> Знаю языки: Бейсик, Паскаль, Си (слегка)
> Занимаюсь программированием: с 8-го класса (сперва Бейсик)


Прикольно. Я уже 21 год программированием занимаюсь, из них 8 лет профессионально (мой основной доход).
И, однако, я так не могу сказать про Бейсик и Паскаль. В смысле, "знаю".


> Что такое АПИ (мои знания): функции, экспортируемые длл
> мастдая (user32, gdi32, kernel32 и т.д.


API - Application Programming Interface. Это что угодно может быть. И "масдай" тут вообще сбоку не валялся.
А если уж речь идёт конкретно о Win32API, то это не "функции, экспортируемые длл мастдая".


> Массивами раньше не занимался, работал с ними только в Паскаль,
>  а тут на масме. На паскале мне это раз плюнуть


Покажи, как огранизовать создание динамического массива с произвольным числом элементов именно на паскале (не Delphi). покажешь - поверю, что тебе это "раз плюнуть". Не покажешь - LMD.


 
Б. Гейтс   (2007-10-26 10:56) [34]


> блииин. чувак.. знал бы ты, какой бред несешь....

Beginner..
Прокомментируй, исправь, что не так?


 
Б. Гейтс   (2007-10-26 10:58) [35]


> Покажи, как огранизовать создание динамического массива
> с произвольным числом элементов именно на паскале (не Delphi).
>  покажешь - поверю, что тебе это "раз плюнуть". Не покажешь
> - LMD.

Кажется, началась стадия обломов...
Когда говорил паскаль, имел в виду дельфи.
SetLength


 
Ega23 ©   (2007-10-26 11:01) [36]


> Кажется, началась стадия обломов...
> Когда говорил паскаль, имел в виду дельфи.
> SetLength


SetLength - для ламеров. "Кулхацкеры", пишущие "массивы на API для масдая" SetLength использовать не должны.
Или сознавайся в собственном ламерстве, или бегом штудировать книгу. Согласен подождать до понедельника.


 
Ins ©   (2007-10-26 11:11) [37]

Эх, тут недавно такое обсуждение про WinAPI было, с участием меня, DVM и Rouse_... Видимо ушло в архив уже. Жаль... Там если повыкидывать лишнее, определение API (и Win32API, как его подмножества) можно выделить.


 
Юрий Зотов ©   (2007-10-26 11:16) [38]

> Б. Гейтс   (26.10.07 10:44) [31]

Я же не зря сказал - Вам программировать учиться надо. Потому что программирование - это вовсе не языки. Язык (любой, хоть Васик, хоть Асм) - это всего лишь инструмент и не более того. Взять в руки кисть (инструмент) может каждый и пользоваться ею может тоже каждый - но ведь при этом он не становится художником, верно? Чтобы стать художником, нужно знать и уметь гораздо больше, чем то, как держать кисть (а чтобы стать хорошим художником, еще и способности нужны, а чтобы стать выдающимся художником - талант нужен).

То же самое и с программированием. Если бы Вы понимали, что такое массив в памяти и как адресуются его элементы, то никаких проблем у Вас бы не возникло. И Вы легко смогли бы самостоятельно реализовать любой массив (включая многомерные) на любом языке (причем без всяких array) - хоть на Паскале, хоть на Асме. А если бы знали, что такое указатели и динамическая память, то легко смогли бы реализовать и любой массив переменной размерности (тоже включая многомерные и тоже на любом языке). Вот что в первую очередь изучать надо, а вовсе не языки и не API.

А Вы говорите - в MASM и в API нет array. Да ведь их там и быть не может, понимаете? И вот эта фраза "как используя АПИ создавать массивы без array, так как использую не паскаль, а масм" - полная чушь. Потому что использование API к созданию массивов не имеет абсолютно никакого отношения, а MASM не имеет абсолютно никакого отношения ни к саозданию массивов, ни к API. В переводе на русский язык Вы спросили примерно следующее: "как, используя паровоз, забить гвоздь, так как использую не молоток, а скрипку".

Рано Вы взялись за MASM и API. Не понимаете Вы их - и не поймете, пока не поймете, что такое програмирование. Возвращайтесь на паскаль и решите Вашу задачу на нем, причем не используя слово array - это будет гораздо полезнее.


 
Игорь Шевченко ©   (2007-10-26 11:16) [39]

Таких не берут в программисты


 
Юрий Зотов ©   (2007-10-26 11:24) [40]

> Б. Гейтс   (26.10.07 10:44) [31]

Короче, луxше всего сказал Вирт: программирование - это алгоритмы плюс структуры данных. Вот это Вам сейчас и нужно изучать - алгоритмы и структуры данных. Причем начинать со структур.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.11.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.04 c
15-1192190332
barakuda
2007-10-12 15:58
2007.11.18
приклеить свою программу к другому приложению


2-1193683190
sdaf
2007-10-29 21:39
2007.11.18
imageList


4-1178231458
Германн
2007-05-04 02:30
2007.11.18
GetComputerNameEx


15-1192448141
alshtam
2007-10-15 15:35
2007.11.18
прозрачная шифрация


15-1192126469
cber
2007-10-11 22:14
2007.11.18
Помогите решить задачу по тер-веру





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский