Нужно создать динамический массив на asmе так, чтобы при добавлении новых элементов уже добавленные не затирались. Это нужно для решения следующей задачи: typedef struct SOME_STRUCT { long xx0; long xx1; } SOME_STRUCT lpIN[99999]; long lpOUT[x]; //динамический массив long dwCr; dwCr=GetCritery(); //получить критерий фильтрации - некое число for (long i=0;i<99999;i++) { if (lpIN.xx1 == dwCr) { if (! IsInArray(&lpOUT, lpIN.xx0)) //если такого значения ещё нет в массиве lpOUT AddElement (&lpOUT, lpIN.xx0); //добавить новый элемент и присвоить ему значение } } Подскажите хотя бы алгоритм. Исходники только приветствуются (желательно на MASM) Заранее спасибо!
RamMerLabs Вобщем, на языке высокого уровня можно использовать realloc. На асме наверняка это все уже есть. Можно отводить память блоками. Например, отводишь массив на 1000 элементов. После исчерпания этих 1000 элементов делаешь realloc на 2000 элементов (при этом старые данные не затрутся, а перенесутся во вновь отведенную память). И так далее.
Ещё раз спасибо! Не подскажешь где можно почитать инфу? Что экспортирует realloc и какой её прототип? (Вообще догадываюсь, что MSVCRT.dll или что-то из той-же оперы)
RamMerLabs Тебе, кстати, лучше использовать связные списки, поскольку в твоей задаче явно напрашивается сортировка, чтобы методами быстрого поиска определять, есть ли уже элемент в массиве, или нет.
RamMerLabs Сначала с помощью HeapCreate создаешь кучу (или вызываешь GetProcessHeap, чтобы получить текущую кучу процесса. Но ее размер ограничен). Дальше HeapAlloc выделяет в созданной тобой куче блок памяти, HeapReAlloc изменяет его размер, и HeapFree освобождает выделенный блок. Если ты сам создавал кучу, то по завершению работы удали ее с помощью HeapDestroy.
Для лентяев в ComCtl32.dll уже реализованы функции работы с динамическими массивами: DPA_*, DSA_*, ... http://msdn2.microsoft.com/en-us/library/ms672634.aspx