Generics Ada泛型:堆栈与堆澄清

Generics Ada泛型:堆栈与堆澄清,generics,heap-memory,instantiation,ada,stack-memory,Generics,Heap Memory,Instantiation,Ada,Stack Memory,所以我有一个作业,上面写着: 请使用包/类的通用实例化。每个BMR(矩阵)的空间必须在通用包/模板内的系统堆栈中分配,可能是在通用实例化期间!您特别不能使用“新建”、“malloc、”或在运行时以任何语言在堆中分配空间的任何其他运算符。请用高亮标记清楚代码的这一部分!您必须读取通用包/模板中的所有事务并打印所有结果。I/O例程必须作为通用参数传递 和不相关的代码: generic type subscript is (<>); --range variable to

所以我有一个作业,上面写着:

请使用包/类的通用实例化。每个BMR(矩阵)的空间必须在通用包/模板内的系统堆栈中分配,可能是在通用实例化期间!您特别不能使用“新建”、“malloc、”或在运行时以任何语言在堆中分配空间的任何其他运算符。请用高亮标记清楚代码的这一部分!您必须读取通用包/模板中的所有事务并打印所有结果。I/O例程必须作为通用参数传递

和不相关的代码:

generic
    type subscript is (<>);     --range variable to be instantiated
    type myType is private;     --type variable to be intantiated
package genericArray is
    type userDefinedArray is array(subscript range <>) of myType;
end genericArray;
同样,发布的代码与赋值无关,但我的问题是,在发布的代码中,每当我使用“new”这个词时,堆栈或堆中是否分配了空间“。因为我的指示说不要使用这个词,但它说要使用泛型实例化,我想这需要它。请澄清

说明书上说

具体来说,您不能使用“new”、“malloc”或任何其他操作符,这些操作符在运行时以任何语言在堆中分配空间

这显然意味着您不能进行堆分配(为什么他们不能先这么说,我不知道;可能更清楚),而“operator”后面的逗号是误导性的

实例化泛型通常发生在编译时;但即使您这样做了

Ada.Integer_IO.Get (N);
declare
   package Inst is new Some_Generic (N);
begin
   ...
end;
实例化本身并不涉及堆分配

您可以编写泛型,以便上面的实例化分配堆栈:

generic
   J : Positive;
package Some_Generic is
   type Arr is array (1 .. J) of Integer;
   A : Arr;    --  in a declare block, this ends up on the stack
end Some_Generic;
甚至堆:

generic
   J : Positive;
package Some_Generic is
   type Arr is array (1 .. J) of Integer;
   type Arr_P is access Arr;
   P : Arr_P := new Arr;  --  always on the heap
end Some_Generic;
但这是因为您在泛型中编写的代码,而不是要求您使用单词
new
来实例化它的语法

具体来说,您不能使用“new”、“malloc”或任何其他操作符,这些操作符在运行时以任何语言在堆中分配空间

这显然意味着您不能进行堆分配(为什么他们不能先这么说,我不知道;可能更清楚)。“operator”后面的逗号有误导性

实例化泛型通常发生在编译时;但即使你这么做了

Ada.Integer_IO.Get (N);
declare
   package Inst is new Some_Generic (N);
begin
   ...
end;
实例化本身并不涉及堆分配

您可以编写泛型,以便上面的实例化分配堆栈:

generic
   J : Positive;
package Some_Generic is
   type Arr is array (1 .. J) of Integer;
   A : Arr;    --  in a declare block, this ends up on the stack
end Some_Generic;
甚至堆:

generic
   J : Positive;
package Some_Generic is
   type Arr is array (1 .. J) of Integer;
   type Arr_P is access Arr;
   P : Arr_P := new Arr;  --  always on the heap
end Some_Generic;

但这是因为您在泛型中编写的代码,而不是要求您使用单词
new
来实例化它的语法。

我想知道您是否使用了与let to相同的类?如果这两个问题中的任何一个都要以重复的形式结束,我认为应该是另一个!我认为你是对的。据我所知,未来作业的所有方向都写得如此糟糕。幸好我找到了这个网站@西蒙·赖特我想知道你是不是在上和我一样的课?如果这两个问题中的任何一个都要以重复的形式结束,我认为应该是另一个!我认为你是对的。据我所知,未来作业的所有方向都写得如此糟糕。幸好我找到了这个网站@Simon Wrightso在堆栈中实例化泛型分配?好的,那么一个在堆中分配东西的例子会是什么样子呢?我已经添加了几个泛型的例子,在实例化时会涉及分配,希望helpsah,如果我错了,请纠正我:1)我在问题中发布的方法在堆栈中分配。2) 为了在堆中进行分配,我需要在泛型中使用单词“new”,就像您在数组中所做的那样。谢谢你的时间,顺便说一句!您的
genericArray
没有声明自己的任何数据对象,只声明一个类型,因此
package createShotArrayType
可能不会分配任何内容。将在堆栈上创建对象
vaccine
。(我不太清楚最初的问题“系统堆栈”是什么意思。)我也不知道,我只知道这家伙讨厌堆上的数据,只要在那里分配数据,他就会扣10+分,所以我只是有点偏执,谢谢你的时间!那么,在堆栈中实例化泛型分配?好的,那么一个在堆中分配东西的例子会是什么样子呢?我已经添加了几个泛型的例子,在实例化时会涉及分配,希望helpsah,如果我错了,请纠正我:1)我在问题中发布的方法在堆栈中分配。2) 为了在堆中进行分配,我需要在泛型中使用单词“new”,就像您在数组中所做的那样。谢谢你的时间,顺便说一句!您的
genericArray
没有声明自己的任何数据对象,只声明一个类型,因此
package createShotArrayType
可能不会分配任何内容。将在堆栈上创建对象
vaccine
。(我不太清楚最初的问题“系统堆栈”是什么意思。)我也不知道,我只知道这家伙讨厌堆上的数据,只要在那里分配数据,他就会扣10+分,所以我只是有点偏执,谢谢你的时间!