2017-08-05 41 views
0

將訪問轉換爲常量以訪問 變量的正確方法是什麼? (是的,我知道那麼我需要小心不要修改這個 「變量」。)Ada:將訪問轉換爲常量以訪問變量

也許Unchecked_Conversion

但是:

  1. Unchecked_Conversion的標準保證在這種情況下, 很好地工作?

  2. 有沒有比Unchecked_Conversion更簡單的方法?

回答

3

Unchecked_Conversion不能保證在這種情況下工作,如阿達不給你訪問類型的內存佈局任何保證。據推測,Ada有意允許編譯器爲每種訪問類型設置獨特的內存佈局和含義。

如果您將Convention => C方面添加到您的訪問類型中,您可能會得到所需的公用內存佈局,因爲C認爲所有指針都在相同的地址空間上運行。

2

好吧,發生了什麼事情[有可能]在參數模式(可能是類型定義)的某處存在不匹配。

比方說,有幾個類型:

Type Window(<>) is tagged private; 
Type Constant_Reference is not null constant access Window'Class; 
Type Reference is not null access Window'Class; 
Type Handle is access Window'Class; 

鑑於Function Get_Handle (Object : in out aliased Window'Class)我們能說的Object'Access?那麼這是對Window'Class的訪問,它不是常量 - 所以它與HandleReference兼容,但不兼容Constant_Reference

另一方面,如果我們有Function Get_Handle (Object : aliased Window'Class)那麼Object'Access將產生一個匿名訪問,由於參數中的恆定性質,它會與Constant_Reference兼容。

因此,檢查你的參數和你的設計,看看是否是什麼導致你的問題。