Динамические массивы

Тема в разделе "WASM.ASSEMBLER", создана пользователем FaceOFF, 18 фев 2005.

  1. FaceOFF

    FaceOFF New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2004
    Сообщения:
    11
    Если такая тема была =) не убивайте меня.



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

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    Была, SEH+COMMIT/DECOMMIT подойдет? Расписывать не нужно?
     
  3. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    >SEH+COMMIT/DECOMMIT подойдет

    Я что-то сам не понял, зачем такой совет :)



    GlobalAlloc->GlobalLock, надо изменить-> копируешь, грохаешь старую, делаешь новую и назад.
     
  4. LocTb

    LocTb New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    54
    FaceOFF, общая идея:
    Код (Text):
    1.  
    2. invoke VirtualAlloc,0,DO_FIGA,MEM_RESERVE
    3.  


    ставишь SEH, в SEH'e:
    Код (Text):
    1.  
    2. invoke VirtualAlloc,GDE_VIOLATION,1,MEM_COMMIT
    3. xor    eax,eax
    4.  




    Пользуешь, и не забываешь:
    Код (Text):
    1.  
    2. invoke VirtualFree
    3.  


    yureckor, IMHO какой-то извращенский способ, проще уж со списками работать.

    PS:

    GlobalXXX - старьё
     
  5. FaceOFF

    FaceOFF New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2004
    Сообщения:
    11
    А как насчет Heap'а?
     
  6. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    masquer



    Простите я не понял:dntknw: Ведь IMHO это описание реализации разряженного массива, а не динамического...
     
  7. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    masquer

    Я имею в виду, что размер виртуальной памяти занимаемой динамическим массивом IMHO должен по идее увеличиваться постепенно, а в данном случае нужно заранее зарезервировать большой объем виртуальной памяти которая может быть нужна для других целей.
     
  8. Alter

    Alter New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2005
    Сообщения:
    9
    Адрес:
    Kiev, Ukraine
    SEH+COMMIT/DECOMMIT вполне подойдет. Это более общий вариант. А вам нужен разреженый с конца массив. :)



    Но я бы предложил иерархический вариант с ручным добавлением/удалением хвоста (не люблю SEH).

    Делаем структуру, содержащую информацию о используемом/зарезервированом к-ве элементом и массив указателей на (к примеру 265-элементные) блоки.

    При необходимости добавить новый блок Realloc нужно делать только на маленький list. И то не каждый раз, если резервировать место.

    К этому прилагается ф-ция доступа к i-му элементу

    GetElementPtr(int i) {

    return (header->list[i/256])+i%256};

    }

    Очень хорошо оптимизируется.
     
  9. johnfound

    johnfound New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2003
    Сообщения:
    74
    Адрес:
    Bulgaria
    А можно скачать Fresh и пользовать "include\libs\arrays.asm" (и arrays.inc) - внутри есть коментары.