2014-07-26 63 views
0

在Ada中,我有以下非常簡單的代碼,這讓我很悲傷。我修剪下來的代碼到最小,藉以說明問題,你需要知道的唯一的事情就是Some_Task是一個任務類型:Ada編譯器:警告變量<X>被分配但從未讀取

task body TB is 
    Task1 : Some_Task_Ref; 
begin 
    Task1 := new Some_Task; 
    loop 
     Put_Line("Main loop is running, whatever..."); 
     delay 5.0; 
    end loop; 
end TB; 

據我瞭解有關任務激活Ada中這應該是足夠了:我創建一個類型爲「Some_Task」的任務,我不必對它做任何事情,它將執行它的主循環,而無需任何干預。這不像在java中你必須調用任務對象上的「開始」方法。

但如果我是正確的,爲什麼編譯器拒絕建立,給我的錯誤:

warning variable "Task1" is assigned but never read 

我爲什麼要被迫「讀」任務1?這是一項任務,它需要做的就是跑步......我錯過了什麼?

注意:這隻有當我在「Gnat模式」(開關-gnatg)中使用GNAT時纔會發生。不幸的是,我需要一些高級編譯指示這種模式,但它似乎引入了一些「overzelous」檢查,如導致上述問題的檢查。我怎樣才能停用那張支票?

+1

嘗試禁用了使用'pragma'這個變量警告:'編譯警告(關,Some_Task_Ref);' – Holt

+2

或'Pragma Unreferenced(Task1);' –

+0

@Holt:這工作,謝謝,雖然現在事實證明,即使這種修復它不起作用,但我會爲此打開一個新的問題... –

回答

0

只是爲了回答這個問題,因爲答案被張貼在一個評論,它不能標記作爲答案。

正如霍爾特說(所有道具給他)這可以固定使用:

pragma Warnings (Off, Some_Task_Ref) ; 
2

這是一個警告,而不是一個錯誤,並且不會阻止構建可執行文件(除非您已打開「將警告視爲錯誤」)。這是編譯器的一個暗示,你可能在創建一個永遠不會使用的變量時犯了一個錯誤。你可以告訴你不indend通過聲明它作爲一個常量使用任務1編譯,就像這樣:

Task1 : constant Some_Task_Ref := new Some_Task; 
+0

不幸的是, 「-gnatg」選項強制「將警告視爲錯誤」,我需要它使用「pragma Pure_12」。有沒有辦法在不使用-gnatg的情況下使用該編譯指示,或者在使用-gnatg時禁用警告? 而在完整的代碼中,我需要在正文中創建任務,因爲它需要其他東西來工作,所以不能使其保持不變。 –

+0

您是否嘗試使用「-gnat12」而不是「-gnatg」? – egilhh