Передача массива функции в Аде - PullRequest
1 голос
/ 04 мая 2020

Я пытаюсь передать свой массив целых чисел под названием «Arr» функции «collect». внутри collect я собираю int от пользователя. как только пользователь вводит 100 int или дает значение 0 или отрицательное число, массив перестанет собираться. Что я делаю не так?

with Ada.Text_IO, Ada.Integer_Text_IO; use Ada.Text_IO;

procedure helloworld is

   procedure PrintHelloWorld is
   begin
      Put_Line ("Enter Integers, up to 100 individual ints.");
   end PrintHelloWorld;

   function collect (A : array) return array is

      A: array (1 .. 100) of integer;

   begin
      Ada.Text_IO.Put ("Enter an integer: ");
      Ada.Integer_Text_IO.Get(I);
      Ada.Text_IO.Put_Line (Integer'Image(I));   
      if I > 0 then
         A(i) := I;
      end if;
   while I > 0 loop
      Ada.Text_IO.Put ("Enter an integer: ");
      Ada.Integer_Text_IO.Get(I);
      Ada.Text_IO.Put_Line (Integer'Image(I));   
      if I > 0 then
         A(i) := I;
      end if;
   end loop;
      return A;
   end collect;
   procedure printArr is
   begin
      for j in Arr'range loop
         Ada.Text_IO.Put_Line(Integer'Image(Arr(j)));
      end loop;
   end printArr;
   Arr: array (1 .. 100) of integer;
   Arr := (others => 0);
   I: Integer;
begin

   Put_Line ("Hello World!");
   PrintHelloWorld;
   Arr := collect(Arr);
   printArr;
end helloworld;

Ошибки терминала:

gnatmake helloworld.adb
x86_64-linux-gnu-gcc-8 -c helloworld.adb
helloworld.adb:13:26: anonymous array definition not allowed here
helloworld.adb:13:46: reserved word "is" cannot be used as identifier
helloworld.adb:15:08: missing ")"
gnatmake: "helloworld.adb" compilation error

Ответы [ 2 ]

4 голосов
/ 05 мая 2020

Похоже, ваше мышление застряло где-то между синтаксисом C / C ++ / Java и Ada. Попробуйте следующий пример.

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

procedure Main is
   type Data_Array is array(Positive range <>) of Integer;

   function Collect return Data_Array is
      Count : Natural := 0;
   begin
      Put_Line("Enter the number of data values you will input");
      Get(Count);
      declare
         Nums : Data_Array(1..Count);
      begin
         Put_Line("Enter" & Count'Image &" values");
         for Value of Nums loop
            Get(Value);
         end loop;
         return Nums;
      end;
   end Collect;

   procedure Print(Item : in Data_Array) is
   begin
      Put_Line("Output of array values:");
      for Value of Item loop
         Put_Line(Value'Image);
      end loop;
   end Print;

begin
   Print(Collect);
end Main;

Процедура Print принимает параметр типа Data_Array, который предоставляется возвращаемым значением функции Collect. Функция collect возвращает только массив точно необходимого размера. Процедура Print принимает массив любого размера, который вы ему отправляете, и распечатывает его содержимое.

1 голос
/ 17 мая 2020

Вот и ты; Я также сделал так, чтобы вы могли добавлять отрицательные числа.
(Если это не то, что вы хотите, измените тип элемента Vector на Natural или Positive по желанию.)
Обратите внимание, что --' комментарии - обходной путь к ошибочному выделителю синтаксиса.

Pragma Ada_2012;
Pragma Assertion_Policy( Ignore );
Pragma Restrictions( No_Implementation_Aspect_Specifications );
Pragma Restrictions( No_Implementation_Pragmas               );

With
Ada.Strings.Equal_Case_Insensitive,
Ada.Text_IO.Text_Streams;

Procedure Example is

   -- Counting and indexing types.
   Type Count is range 0..100;
   Subtype Index is Count range Count'Succ(Count'First)..Count'Last; --'

   -- Array-type; its range is constrained by Index.
   Type Vector is Array(Index range <>) of Integer;

   -- Here we build the input-vector.
   Function Get_Input return Vector is

      -- Here we get user-input; we pass our working-set as a parameter so
      -- that it can be built in-place; this also ensures that we only ever
      -- generate a result of the appropriate length.
      Function Get_Working( Working : Vector:= (2..1 => <>) ) return Vector is
         Function "="(Left, Right : String) Return Boolean
           renames Ada.Strings.Equal_Case_Insensitive;
      Begin
         -- We never try to add to a full array.
         if Working'Length = Index'Last then
           return Working;
         end if;
         -- We get an integer, or are finished.
         loop
            Ada.Text_IO.Put( "Enter an integer or type 'Done': " );
            READ_INPUT:
            Declare
               User_Input  : Constant String:= Ada.Text_IO.Get_Line;
            Begin
               return Get_Working( Working & Integer'Value(User_Input) ); --'
            Exception
               when Constraint_Error =>
                  if User_Input = "Done" then
                     return Working;
                  end if;
            End READ_INPUT;         
         end loop;     
      End Get_Working;
   Begin
      Return Get_Working;
   End Get_Input;

   Procedure Print( Object : Vector ) is
   Begin
      Ada.Text_IO.Put( '[' );
      for Index in Object'Range loop --'
         Ada.Text_IO.Put( Integer'Image(Object(Index)) ); --'
         if Index /= Object'Last then --'
            Ada.Text_IO.Put(',');
         end if;
      end loop;
      Ada.Text_IO.Put( ']' );
   End Print;



Begin
   declare
      V : constant Vector:= Get_Input;
   begin
      Print( V );
      Ada.Text_IO.New_Line( 2 );
   end;

   Ada.Text_IO.Put_Line( "Done." );
End Example;

Пример выполнения:
Enter an integer or type 'Done': 21
Enter an integer or type 'Done': 4
Enter an integer or type 'Done': 18
Enter an integer or type 'Done': DONE
[ 21, 4, 18]

Done.

...