Массив

Тема в разделе "WASM.WIN32", создана пользователем RamMerLabs, 12 фев 2007.

  1. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Нужно создать динамический массив на 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)

    Заранее спасибо!
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    RamMerLabs
    Вобщем, на языке высокого уровня можно использовать realloc. На асме наверняка это все уже есть.
    Можно отводить память блоками. Например, отводишь массив на 1000 элементов. После исчерпания этих 1000 элементов делаешь realloc на 2000 элементов (при этом старые данные не затрутся, а перенесутся во вновь отведенную память). И так далее.
     
  3. ring4

    ring4 New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2006
    Сообщения:
    279
    RamMerLabs
    Для твоего случая подойдет работа с векторами.(С++)
     
  4. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Ещё раз спасибо!
    Не подскажешь где можно почитать инфу?

    Что экспортирует realloc и какой её прототип?
    (Вообще догадываюсь, что MSVCRT.dll или что-то из той-же оперы)
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    RamMerLabs
    Корифеи асма тебе подскажут :)
     
  6. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Я сейчас не за своим компом, инстументов - никаких, поэтому и спрашиваю.
     
  7. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.351
    RamMerLabs
    HeapAlloc, HeapRealloc, HeapFree из kernel32.dll (форвард в ntdll.dll)
     
  8. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    А можно алгоритм работы с ними, а то я немного не въехал.
     
  9. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    RamMerLabs
    Тебе, кстати, лучше использовать связные списки, поскольку в твоей задаче явно напрашивается сортировка, чтобы методами быстрого поиска определять, есть ли уже элемент в массиве, или нет.
     
  10. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.351
    RamMerLabs
    Сначала с помощью HeapCreate создаешь кучу (или вызываешь GetProcessHeap, чтобы получить текущую кучу процесса. Но ее размер ограничен).
    Дальше HeapAlloc выделяет в созданной тобой куче блок памяти, HeapReAlloc изменяет его размер, и HeapFree освобождает выделенный блок.
    Если ты сам создавал кучу, то по завершению работы удали ее с помощью HeapDestroy.
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Для лентяев в ComCtl32.dll уже реализованы функции работы с динамическими массивами: DPA_*, DSA_*, ...
    http://msdn2.microsoft.com/en-us/library/ms672634.aspx
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    rmn
    Дефолтная куча процесса - растущая, т.е. ее размер не ограничен
     
  13. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Сделал с Heap***, всё работает нормально. Всем спасибо!