2016-09-07 30 views
2

我正在玩ADA,試圖抓住它。儘管如此,我仍然很難弄清楚判別部分。我有一個判別式的任務,我試圖給它一個持續時間。但是它告訴我:如何傳遞判別式ada的持續時間?

package Procedures is 
    task type WhatchDog(dur : Duration := 1.0) is 
     entry Reset(start : in Time); 
     entry Sync(timedOut : out Boolean); 
    end WhatchDog; 
end Procedures; 

with Procedures; 
procedure Main is 
    watch : Procedures.WhatchDog(dur => 0.5); 
begin 
    null; 
end Main; 

判別式必須有一個獨立或接入類型。

當我改變我的判別類型的接入類型,

task type WhatchDog(dur : access Duration := 1.0) is 

它給了我以下警告:

期望與指定類型的訪問類型「標準時間」

找到類型通用實數

我知道還有其他方法來實現構造函數,例如創建入口點。但我想知道我在這裏做錯了什麼,並瞭解我正在犯的錯誤。 迄今爲止我所做的谷歌工作並沒有真正發現這一點,並且只使用了真正可以正常工作的類型。例如: http://www.adaic.org/resources/add_content/docs/95style/html/sec_6/6-1-3.html

回答

1

,你不能分配給1.0dur(接入判別)的原因是dur是一個指針類型(匿名,獲得Duration),而1.0是數字文字。簡而言之,你不能給一個指針變量指定一個真實值,只能指向一個指針變量的指針值。見Alex's answer獲得一個方法。

Duration類型不是離散類型,即既不是整數也不是枚舉。但是,如果不是訪問類型,則判別式必須是什麼,鑑於判別式的初始意圖,如manuBriot所述。

因此,要通過傳遞dur的值來初始化任務對象的某個方面,您需要指針。以下小改寫不使用分配器(新增),它使用持續時間值的名稱,然後使用'Access指針。

package Procedures is 

    Duration_By_Default : aliased constant Duration := 1.0; 

    task type Whatchdog 
    (dur : access constant Duration := Duration_By_Default'Access) 
    is 
     entry Reset(start : in Time); 
     entry Sync(timedOut : out Boolean); 
    end WhatchDog; 
end Procedures; 

with Procedures; 
procedure Main is 
    Desired_Duration : aliased constant Duration := 0.5; 

    watch : Procedures.WhatchDog(dur => Desired_Duration'Access); 
begin 
    null; 
end Main; 

請注意訪問值指向變量持續時間的含義,而不是如此處所示的持續持續時間。

或者,執行一個計算,從某個整數判別式產生一個Duration值,例如命名爲dur_in_msec

task body Whatchdog is 
    dur : constant Duration := Duration(Float(dur_in_msec)/1_000.0); 
+0

謝謝你的深入示例和解釋! – Elamre

3

在您嘗試的解決方法中,您嘗試將持續時間分配給Access。正確的任務將是,如果要這樣:

task type WatchDog (Dur : access Duration := new Duration'(1.0)) is 

在具有永遠不會釋放,也就是一個小內存泄漏的分配的價格。如果您在長期生活的程序中創建/銷燬任務類型的許多實例,這可能會成爲問題,但在這種情況下,您還必須負責收割任務(至少在Gnat中)。

在這種情況下,我可能會有第一個條目將Duration值傳遞給任務,或者使用Natural作爲判別式,並將其轉換爲毫秒(或任何適當的值)並將其轉換爲任務內的值。當然,這是一種語言中的癢。

3

我不確定這是判別式的用途。在這裏,duration實際上是您的實例的配置,但不會影響內存中類型的佈局。所以我認爲要麼有一個Configure條目可以進行初始設置,或者如果在創建實例時確實需要提供這些條目會更好(當然更常見),您可以嘗試創建一個generic正式的Duration參數。

+0

我知道創建一個切入點是更好的方式來做到這一點,但我想了解的判別特徵:) – Elamre