У меня возникли проблемы с созданием толстого указателя. Мой текущий набор объявлений выглядеть следующим образом:Возвратите жир/толстый указатель как параметр out
type Index_Typ is mod 20; -- will be larger in real life
type Data_Buffer_Typ is array (Index_Typ range <>) of Integer; --unconstrained array type
type Data_Buffer_Ptr is access all Data_Buffer_Typ; -- a thick pointer, contains the bounds of array subtype pointed to and address..
Data_Buffer : aliased Data_Buffer_Typ (Index_Typ) := (others => 0); -- this is private
type Result_Typ is (Ok, Overflow, Null_Pointer);
procedure Retrieve (Index : in Index_Typ;
Len : in Index_Typ;
Data_Ptr : out Data_Buffer_Ptr;
Result : out Result_Typ) is
begin
-- assuming range checks are ok, what goes here ?
end Retrieve;
так, если я заявляю:
Ptr : Data_Buffer_Ptr := null;
и дал вызов Retreive (2,3, Ptr,Result);
как я в конечном итоге с указателем, который указывает на элементы 2,3 & 4 из Data_Buffer
?
Примечания:
- Да я знаю, раздавая срез массива, вероятно, будет сделано как указатель в любом случае, но мы хотим, чтобы явно использовать указатели, а не неявно (а не мой выбор!).
- Да, я экспериментировал, я обычно получаю: (
object subtype must statically match designated subtype
) сообщение об ошибке .. - По возможности использовать
new
, которого следует избегать.
(a) Если вы должны использовать суффиксы, чтобы указать, что имя обозначает тип, почему бы не использовать '_Type'? или просто '_T'? (b) вы не показываете нам, что 'Result_Typ' (c) являются параметрами' Data_Ptr' и 'Result' действительно' out'? –
@SimonWright (а) стандарты кодирования компании. (b) Result_typ - это перечисление. Не имеет значения, просто указывает, успешна ли операция или почему нет (переполнение конца ошибок типа буфера). c) Да и Да. – NWS
@SimonWright - в (c) вы предполагаете, что 'in out' может быть более уместным? – NWS