在Ada中,分配Object.All意味着什么?
考虑以下任务:在Ada中,分配Object.All意味着什么?,ada,Ada,考虑以下任务: procedure Assign(Original : myAccessType) is Other : myAccessType; begin Other.all := Original.all; Other.IntegerValue := Original.IntegerValue; end 我不太确定第一个作业是做什么的。作业中.All的意义是什么?还有,整数值的第二个赋值是否仍然需要?。all是访问类型的显式解引用。。all是访问类型的
procedure Assign(Original : myAccessType) is
Other : myAccessType;
begin
Other.all := Original.all;
Other.IntegerValue := Original.IntegerValue;
end
我不太确定第一个作业是做什么的。作业中
.All
的意义是什么?还有,整数值的第二个赋值是否仍然需要?。all
是访问类型的显式解引用。。all
是访问类型的显式解引用。第一个赋值将引发约束错误
,因为在Ada中,访问值被初始化为null
假设你改写了
Other : myAccessType := new myType;
然后
这意味着(除非其中使用了Ada.Finalization
),由Original
指向的位将被复制到由Other
指向的位中
因此,没有必要做第二项作业
我不是一个专业的C程序员,但我认为你的代码相当于
typedef struct myType {
int IntegerValue;
} *myAccessType;
void assign(myAccessType original)
{
myAccessType other; // uninitialized
*other = *original;
other->IntegerValue = original->IntegerValue;
}
第一个赋值将引发
Constraint\u Error
,因为在Ada中,访问值被初始化为null
假设你改写了
Other : myAccessType := new myType;
然后
这意味着(除非其中使用了Ada.Finalization
),由Original
指向的位将被复制到由Other
指向的位中
因此,没有必要做第二项作业
我不是一个专业的C程序员,但我认为你的代码相当于
typedef struct myType {
int IntegerValue;
} *myAccessType;
void assign(myAccessType original)
{
myAccessType other; // uninitialized
*other = *original;
other->IntegerValue = original->IntegerValue;
}
深拷贝而不是浅拷贝。因此,第二个任务是多余的。任何关于Ada的教科书都应该回答这个问题。我做了一些搜索,但没有找到一个有意义的答案。深拷贝而不是浅拷贝。因此,第二个任务是多余的。任何关于Ada的教科书都应该回答这个问题。我做了一些搜索,但没有找到一个有意义的答案。所以它实际上是在创建一个副本,而不仅仅是一个参考(在C术语中称为“深度副本”),是的,但只有一个级别;如果上面的
myType
包含指向某个对象的指针,那么该指针将被复制,并且两个副本将指向同一个内存。我认为这是一个公平的权衡。在我的特殊情况下,我不认为这会带来问题,所以它实际上是在创建一个副本,而不仅仅是一个引用(在C术语中称为“深度副本”),是的,但只是一个级别;如果上面的myType
包含指向某个对象的指针,那么该指针将被复制,并且两个副本将指向同一个内存。我认为这是一个公平的权衡。在我的特殊情况下,我不认为这会带来问题。它实际上回答了问题。作为最初的提问者,我尊重地不同意。关于堆栈溢出的答案应详细说明,直到提供明确的答案以及支持的背景信息。如果提问者(我)对正在发生的事情感到困惑,那么像西蒙这样的回答对未来的读者会更有帮助。这个答案没有回答我的任何一个问题,特别是第二个关于实际用法的问题。它实际上回答了这个问题。作为最初的提问者,我恭敬地表示不同意。关于堆栈溢出的答案应详细说明,直到提供明确的答案以及支持的背景信息。如果提问者(我)对正在发生的事情感到困惑,那么像西蒙这样的回答对未来的读者会更有帮助。这个答案没有回答我的任何一个问题,特别是第二个问题,它涉及实际用法。