В приведенном ниже примере мне интересно, почему line 17
не работает, но line 18
? Могу ли я не преобразовать System.Address
непосредственно в Integer
(см. line 17
)?Конвертировать из System.Address в Integer в Ada
main.adb
with Ada.Text_IO;
with Ada.Unchecked_Conversion;
with System.Storage_Elements;
procedure Main is
package SSE renames System.Storage_Elements;
type Integer_Access is access Integer;
I1_Access : Integer_Access := new Integer'(42);
I1_Address : System.Address := I1_Access.all'Address;
function Convert1 is new Ada.Unchecked_Conversion (System.Address, Integer);
function Convert2 is new Ada.Unchecked_Conversion (System.Address, Integer_Access);
begin
Ada.Text_IO.Put_Line (SSE.To_Integer (I1_Access'Address)'Img);
Ada.Text_IO.Put_Line (SSE.To_Integer (I1_Access.all'Address)'Img);
Ada.Text_IO.Put_Line (I1_Access.all'Img);
Ada.Text_IO.Put_Line (Convert1 (I1_Address)'Img); -- why does this NOT work?
Ada.Text_IO.Put_Line (Convert2 (I1_Address).all'Img); -- why does this work?
end Main;
Результат
140734773254664
140243203260416
42
-363855872
42
Спасибо! Я попробовал 'пакет Convert3 - это новый System.Address_To_Access_Conversions (Integer);' с 'Ada.Text_IO.Put_Line (Convert3.To_Pointer (I1_Address) .all'Img);' который работал. Теперь имеет смысл, почему 'Convert1' не может работать. – user1091344