我正在Ada for Data Structures and Algorithms类中创建一个程序。
我当前的问题是错误'实际上“this”必须是变量' 我做了一些环顾四周,我读到它是因为 in out 模式,但我并不完全理解为什么它发生在我身上我想。
我看到的例子很有意义,但我想,因为这是我的编码,我只是没有看到它?
Procedure AddUnmarked(g:Grid; this:Linked_List_Coord.List_Type; c:Cell) is
cNorth : Cell := getCell(g, North(c));
cEast : Cell := getCell(g, East(c));
cSouth : Cell := getCell(g, South(c));
cWest : Cell := getCell(g, West(c));
Begin
if CellExists(g, cNorth) and not cNorth.IsMarked then
Linked_List_Coord.Append(this, cNorth.Coords);
elsif CellExists(g, cEast) and not cEast.IsMarked then
Linked_List_Coord.Append(this, cEast.Coords);
elsif CellExists(g, cSouth) and not cSouth.IsMarked then
Linked_List_Coord.Append(this, cSouth.Coords);
elsif CellExists(g, cWest) and not cWest.IsMarked then
Linked_List_Coord.Append(this, cWest.Coords);
end if;
End AddUnmarked;
在“this”传递给函数之前,它是我自定义类型Coord的Linked_List(2个整数)。它被初始化,并且在列表传递给我的代码中的上述函数之前已经添加了一个坐标对。
答案 0 :(得分:6)
这意味着除非您将列表作为可修改的参数传递,即in out
,否则无法修改列表。
详细说明,将LIST_TYPE
视为标记类型对象的句柄;为了确保LIST_TYPE
有效,您需要通过in
参数传递(或创建/操作本地对象),但要传递结果,您需要out
参数。
因此,为了对已存在的对象进行操作{并获得结果},您需要in out
。
答案 1 :(得分:2)
在Ada中,子程序参数都具有与之关联的使用模式。可用模式为in
,out
和in out
*。如果您没有指定模式,(就像您的代码中没有那样),则默认为in
。
模式指定您可以在子程序内部使用该参数执行的操作。如果要读取从例程外部传入的值,则必须在其上in
。如果要写入参数(和/或可能在例程外读取),则它必须有out
。
由于您的参数都没有out
,因此您无法写入任何参数。
(* - 还有另一种可能的模式:access
,但这是一个高级主题。)