【发布时间】:2015-11-11 12:45:30
【问题描述】:
我需要创建一些处理任意大小矩阵的函数。我熟悉使用here 的declare 语法,但这是大学作业,我的教授告诉我使用'declare' 有矫枉过正。我在网上找不到任何相关的东西,有什么帮助吗?
基本上我希望通过键盘获取矩阵大小,然后使用生成的矩阵,我坚持使用declare
目前我有:
type myMatrix is array (Natural range <>, Natural range <>) of Integer;
type myVector is array (Natural range <>) of Integer;
我把它用作:
procedure Lab1 is
begin
declare A, B: myVector(1..5):=
(3, 14, 15, 92, 6);
它不允许在运行时指定大小,并且:
declare
int1:Integer:=generate_random_number(50)+2;
int3:Integer:=generate_random_number(50)+2; -- +2 so we don't get length/size 0 or 1
X, Y:myVector(1..int1):=(others=>generate_random_number(20));
MT:myMatrix(1..int1, 1..int3):=(others =>(others=>generate_random_number(10))); -- 'others' used for all the unmentioned elements, http://rosettacode.org/wiki/Array_Initialization
MS:myMatrix(1..int3, 1..int1):=(others =>(others=>generate_random_number(10)));
F3_result:myMatrix(1..int1, 1..int1);
begin
F3_result:=F3(X, Y, MT, MS);
end;
它使用declare 块。稍后我可能需要使用生成的数组,据我所知,这里 F3 是一个局部变量,因此不能重用?
还有其他方法吗?
【问题讨论】:
-
在什么意义上是矫枉过正?当然还有其他方法,包括“new”和 unchecked_deallocate,但您可以简单地将“declare”块重构为对过程的调用(在本地声明,如果您不想将所有内容作为参数传递)或返回 F3_result 的函数,看看他是否注意到...
-
这个example 对比
declare和new。 -
顺便说一句,generate_random_number 似乎生成整数,这可能不适合自然类型的数组边界。 Aka 你有没有想过如果 generate_random_number 在声明一个边界数组 1 .. -50 时返回 -50 会发生什么?
-
@trashgod :在您链接的示例的堆分配部分中,没有明确的释放:这会导致内存泄漏还是发生了一些幕后魔术?
-
@BrianDrummond:没有魔法;我已经更新了答案,以提供有关堆/池存储的更广泛背景。
标签: arrays matrix multidimensional-array ada