Ada - 动态重新分配阵列

时间:2011-12-11 10:21:53

标签: arrays dynamic memory-management ada

我正在尝试编写基于数组的堆栈,可以动态重新分配。我遇到的主要问题是如何实现调整数组大小的过程。在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的实现,但是唉...这是对big = P

到目前为止,我已经做到了Vector.ads任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:6)

好的,案件已经解决了。我已经完成了我的Vector类(它实际上是一个数组的堆栈构建)。感谢大家的帮助。

为了后代,这里是我的代码。希望有人能从中学到一些东西。 代码 - &gt; https://gist.github.com/496a50bc7f5cd93f8d91

如果你想看看并找到值得改变的东西,只需评论。 ; d

答案 1 :(得分:5)

如果您选择Ada.Containers.VectorsRationale for Ada 2005: §8.2 Lists and vectors会有一个有用的讨论。基本上,您使用Index_TypeElement_Type

实例化通用包
package Container is new Containers.Vectors (Natural, T);

然后声明一个具有新类型的变量:

Stack : Container.Vector;

然后Push过程变为Stack.AppendPop函数返回Stack.Last_Element。请注意prefixed notation的可用性。

答案 2 :(得分:4)

据推测,您知道如何最初为堆栈分配(空)数组。

当您需要重新分配到更大的数组时,将其分配到本地访问变量,类似于C ++示例中的“st”。然后循环遍历现有的完整数组,将其元素复制到新分配的元素中。

免费,使用Unchecked Deallocation的实例化,旧数组 - 这是Vector记录中的Elements字段。然后将Elements字段设置为包含新分配的数组的变量。

基本上,它紧跟你的C ++示例,只是你不需要使用sizeof(),并使用memset / memcpy的副本循环。