Ада: пользовательский тип в диапазоне 1..var? - PullRequest
2 голосов
/ 05 октября 2019

Я очень новичок в коде Ады. Я использую GPS от AdaCore.

Я бы создал переменную, размер которой определяется пользователем. Я пишу это:

-- My ada program --
with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;

procedure main is
   wanted : Integer := 10;

   type custom is range 0..wanted;
...

Но в строке 8 что-то пошло не так:

Builder results
    C:\Users\**********\Desktop\ada project\src\main.adb
        8:26 "wanted" is not static constant or named number (RM 4.9(5))
        8:26 non-static expression used for integer type bound

Я действительно не понимаю, что это значит ... Может кто-нибудь мне помочь?

Ответы [ 2 ]

3 голосов
/ 06 октября 2019

Как сказал Тимур, требуемый должен быть постоянным в своем объеме. Это позволяет вам делать некоторые приятные вещи, такие как объявление типа внутри процедуры. Посмотрите на это, это может быть интересно:)

-- My ada program --
with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;

procedure Main is

   procedure Test (Wanted : Integer) is
      type custom is new Integer range 0..wanted;
   begin
      Put_Line("First value " & Custom'Image (Custom'First) 
          & " Last value " & Custom'Image (Custom'Last));
   end Test;

begin
   Test (10);
   Test (12);
end Main;

Вывод

First value  0 Last value  10
First value  0 Last value  12

В этом случае ваш тип отличается от одного вызова к другому, но работает как требуемый является постоянным в процедуре. Единственное, что определенный тип должен быть новым производным типом типа вашего параметра.

Я позволю вам подумать о возможностях:)

3 голосов
/ 05 октября 2019

Переменная wanted не является константой, она может изменить свое значение во время выполнения программы, поэтому эту переменную нельзя использовать в качестве ограничения диапазона при объявлении новых типов. Однако вы можете сделать его постоянным, используя ключевое слово constant (Wanted : constant Integer := 10;). Это должно решить вашу проблему.

...