Ada - динамически перераспределить массив - PullRequest
2 голосов
/ 11 декабря 2011

Я пытаюсь написать стек на основе массива, который может быть динамически перераспределен.Основная проблема у меня заключается в том, как реализовать процедуру, которая изменяет размер массива.В C ++ это может выглядеть так:

template<class T, int incr>
void Vector<T, incr>::inflate(int increase) {
    const int tsz = sizeof(T*);
    T** st = new T*[quantity + increase];
    memset(st, 0, (quantity + increase) * tsz);
    memcpy(st, storage, quantity * tsz);
    quantity += increase;
    delete []storage;
    storage = st;
}

, где int quantity; и T** storage; объявлены в приватном разделе.

Если есть кто-нибудь, кто мог бы поделиться со мной некоторым примером, я быбыть очень благодарным.Я пытался просмотреть реализацию Ada.Containers.Vectors, но, черт возьми ... она слишком большая = P

Пока я сделал это Vector.ads Может кто-нибудь помочь?

Ответы [ 3 ]

6 голосов
/ 13 декабря 2011

Хорошо, дело раскрыто. Я закончил свой класс Vector (который на самом деле является сборкой стека в массиве). Спасибо всем за помощь.

Просто для потомков вот мой код. Надеюсь, кто-то чему-то научится на этом. Код -> https://gist.github.com/496a50bc7f5cd93f8d91

Если вы хотите посмотреть и найти что-то, что стоит изменить, просто прокомментируйте. ; D

5 голосов
/ 11 декабря 2011

Если вы выберете Ada.Containers.Vectors, в обосновании для Ada 2005 есть полезное обсуждение: §8.2 Списки и векторы .По сути, вы создаете экземпляр универсального пакета с помощью Index_Type и Element_Type:

package Container is new Containers.Vectors (Natural, T);

Затем объявляете переменную с новым типом:

Stack : Container.Vector;

Затем выполняется процедура Pushстановится Stack.Append, а функция Pop возвращает Stack.Last_Element.Обратите внимание на наличие с префиксной нотацией .

4 голосов
/ 11 декабря 2011

Предположительно, вы знаете, как изначально выделить (пустой) массив для вашего стека.

Когда вам нужно перераспределить массив большего размера, выделите его в локальной переменной доступа, аналогично "st" в вашемC ++ пример.Затем зациклите существующий полный массив, скопировав его элементы в только что выделенный.

Свободно, используя экземпляр Unchecked Deallocation, старый массив - это поле Elements в вашей записи Vector.Затем установите в поле Elements переменную, содержащую только что выделенный массив.

По сути, оно близко следует вашему примеру C ++, только вам не нужно возиться с sizeof (), и вы используете шаг копирования цикла, поднятый изMemSet / тетсру.

...