1

我正在 Ada 中为数据结构和算法课程制作一个程序。

我目前的问题是错误“这个”的实际值必须是一个变量” 我环顾四周,我读到它是因为在 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(2 个整数)的 Linked_List。在我的代码中将列表传递给上面的函数之前,它已被初始化并添加了一个坐标对。

4

2 回答 2

6

这意味着列表不能被修改,除非您将它作为可修改参数传递,即in out.

详细地说,LIST_TYPE可以将其视为标记类型对象的句柄;为了确保它LIST_TYPE有效,您需要通过in参数将其传递(或创建/操作本地对象),但要传递您的结果,您需要一个out参数。

因此,为了对已经存在的对象进行操作{并返回结果},您需要in out.

于 2012-10-30T03:58:09.517 回答
2

在 Ada 中,子程序参数都有与之相关的使用模式。可用的模式是inoutin out*。如果您没有指定模式(就像您没有在代码中一样),那么它默认为inonly。

这些模式指定您可以在子程序内部使用该参数做什么。如果你想读取从例程外部传入的值,它必须有in它。如果你想写入参数(和/或可能让它在例程之外读取),那么它必须有out它。

由于您的任何参数都没有out,因此您无法写入其中任何一个。

(* - 还有另一种可能的模式:access,但这是一个高级主题)。

于 2012-10-30T12:01:01.847 回答