问题
Is it possible to have an array with size that is determined at runtime like so,
Procedure prog is
type myArray is array(Integer range <>) of Float;
arraySize : Integer := 0;
theArray : myArray(0..arraySize);
Begin
-- Get Array size from user.
put_line("How big would you like the array?");
get(arraySize);
For I in 0..arraySize Loop
theArray(I) := 1.2 * I;
End Loop;
End prog;
Is there a way to achieve this result other than using dynamically Linked Lists or another similar structure? Or is there a simple built in data structure that would be simpler than using dynamically linked lists?
回答1:
Sure, declare it in a block as follows:
procedure prog is
arraySize : Integer := 0;
type myArray is array(Integer range <>) of Float;
begin
-- Get Array size from user.
put_line("How big would you like the array?");
get(arraySize);
declare
theArray : myArray(0..arraySize);
begin
for I in 0..arraySize Loop
theArray(I) := 1.2 * I;
end Loop;
end;
end prog;
or pass the arraySize as an argument into a subprogram and declare and operate on it in that subprogram:
procedure Process_Array (arraySize : Integer) is
theArray : myArray(0..arraySize);
begin
for I in arraySize'Range Loop
theArray(I) := 1.2 * I;
end Loop;
end;
This is just illustrative (and not compiled :-), as you need to deal with things like an invalid array size and such.
回答2:
Yes, you can defer the declaration of a constrained object until you know the size. In this example, the array Candidates
can be allocated in a nested block (introduced by the keyword declare
) or on the heap (using the keyword new
). In this related example, Line
has a different size each time through the loop, depending on what Get_Line
finds.
来源:https://stackoverflow.com/questions/13735274/dynamic-array-size-determined-at-runtime-in-ada