Я пытаюсь что-то сделать с передачей массива и типами доступа. Я столкнулся с ситуацией, когда размер стека во встроенной системе затрудняет передачу большого массива через типичный механизм передачи параметров.
Чтобы сохранить размер стека, я начал использовать типы доступа, но я не хочу делать динамическое распределение c.
У меня есть что-то вроде этого:
type My_Array_Type is array (Natural range<>) of Integer;
type My_Array_Type_Ptr is access all My_Array_Type;
procedure Do_Stuff(Things : My_Array_Type_Ptr) is
begin
-- things
end Do_Stuff;
procedure Do_Stuff(Num_Things : Integer) is
Things : My_Array_Type_Ptr := new My_Array_Type(1..Num_Things);
begin
Do_Stuff(Things);
-- more things
end Do_Stuff;
ОДНАКО, я бы хотел сделать что-то вроде этого:
type My_Array_Type is array (Natural range<>) of Integer;
procedure Do_Stuff(Things : access all My_Array_Type) is
begin
-- things
end Do_Stuff;
procedure Do_Stuff(Num_Things : Integer) is
Things : aliased My_Array_Type(1..Num_Things);
begin
Do_Stuff(Things'Access);
-- more things
end Do_Stuff;
Но, очевидно, это не так не работает
По сути, я хочу передать ссылку на выделенный массив стека и изменить его в другой подпрограмме, но я не хочу динамически распределенной памяти. Как я могу это сделать?
Кроме того, в качестве примечания: я постоянно вижу противоречивую информацию о том, динамически ли распределяется что-то, нужно ли это выпускать или нет - я читал, что большинство реализаций не имеют сборщиков мусора но они не нужны. Кто-нибудь может уточнить - в примере, который я показал первым, мне нужно явно освободить?
РЕДАКТИРОВАТЬ: После попытки решения, упомянутых ниже, я остановился на комбинации двух вещей:
- Используя механизм передачи параметров
in out
. - Снижение требований к хранилищу моего типа данных.
Поэтому вместо Integer
я использую:
type UInt8 is new Interfaces.Unsigned_8;
Что:
type UInt8 is mod 2**8
with Size => 8;
Это прекрасно работает, так как мои значения не ' На самом деле это целые числа, они на самом деле являются беззнаковыми байтами.