2012-10-30 52 views
1

我正在Ada中爲數據結構和算法類做一個程序。Ada實際的這個必須是一個變量在輸出模式

我現在的問題是錯誤「實際爲‘這’必須是一個變量」 我做了一些環顧四周,我讀到它了模式是因爲,但我不能完全把握我猜爲什麼它發生在我身上。

我看過的例子很有意義,但我猜是因爲這是我的編碼我只是沒有看到它?

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; 

之前「這個」被傳遞給函數這是我自定義類型座標(2點的整數)的Linked_List。它被初始化並且在列表傳遞給我的代碼中的上面的函數之前已經添加了一個座標對。

回答

6

這意味着該列表不能被修改,除非您將它作爲可修改參數傳遞,即in out

詳細說明一下,將LIST_TYPE想象成爲標記類型對象的句柄;爲了確保LIST_TYPE有效,您需要通過in參數(或創建/操作本地對象)將其傳入,但要傳遞結果,需要參數out

因此,爲了對已經存在的對象進行操作{並獲得結果},您需要in out

+0

* facepalm *謝謝,我確實感到遲鈍大聲笑。我列出了List的功能,但沒有這個功能,所以從來沒有想到這是問題。 – Shelby115

+0

沒問題。我也詳細闡述了一下。 – Shark8

2

在Ada中,子程序參數都有與它們相關的使用模式。可用的模式是in,outin out *。如果你沒有指定一個模式(如你沒有在你的代碼中),那麼它只能默認爲in

這些模式指定您可以在子程序的內部使用該參數執行的操作。如果要讀取從例程外部傳入的值,它必須有in。如果要寫入參數(和/或可能在例程之外讀取),那麼它必須有out

由於您的參數都沒有out,因此您無法寫入任何參數。

(* - 還有另一種可能的模式:access,但這是一個高級主題)。

+0

關於'access'參數模式的話題,有沒有什麼地方需要它們?我知道GNAT JVM Ada編譯器在導入的[library]規範中非常重要地使用它們。 – Shark8

+0

@ Shark8 - 如果你有這樣一個好問題,也許你應該問這是一個SE問題。 :-) –

+0

好吧,問:http://stackoverflow.com/questions/13146219/what-is-the-usefulness-of-the-access-parameter-mode – Shark8

相關問題