【问题标题】:Is it possible to create dynamically 2d arrays in Ada without using 'declare'?是否可以在不使用“声明”的情况下在 Ada 中创建动态二维数组?
【发布时间】:2015-11-11 12:45:30
【问题描述】:

我需要创建一些处理任意大小矩阵的函数。我熟悉使用heredeclare 语法,但这是大学作业,我的教授告诉我使用'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 对比declarenew
  • 顺便说一句,generate_random_number 似乎生成整数,这可能不适合自然类型的数组边界。 Aka 你有没有想过如果 generate_random_number 在声明一个边界数组 1 .. -50 时返回 -50 会发生什么?
  • @trashgod :在您链接的示例的堆分配部分中,没有明确的释放:这会导致内存泄漏还是发生了一些幕后魔术?
  • @BrianDrummond:没有魔法;我已经更新了答案,以提供有关堆/池存储的更广泛背景。

标签: arrays matrix multidimensional-array ada


【解决方案1】:

我同意您的老师的观点,即在 begin 之后放置 declare 通常表明不需要 declare 块(我能想到的唯一例外是因为您想要处理可能出现的异常作为封闭子程序中变量声明的一部分)。

因此,您可以在子程序的开头同时删除 begindeclare,这应该同样有效。

【讨论】:

  • 啊哈!如果 that 是他的意思……是的,简单地将声明提升到begin 上方是正确的方法,而新的块是矫枉过正的。但是如果你需要在begin之后读取键盘输入来获取参数,那是不可能的。
猜你喜欢
  • 1970-01-01
  • 2018-03-26
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 2012-10-12
  • 2012-03-17
相关资源
最近更新 更多