Я изучаю Аду (пытаясь решить задачи https://adventofcode.com/2018/).Для начала я пытаюсь разработать ряд «служебных» пакетов, которые помогут с обработкой текста и т. Д.
Я успешно написал функцию, которая будет читать из stdin и возвращать массив Unbounded_String
s.для каждой строки ввода.
Я пытаюсь изменить эту функцию, чтобы сделать то же самое, но вместо этого преобразовать каждый Unbounded_String
в Integer
перед вставкой в массив.
Вот мойпакет:
get_stdin.ads:
with Ada.Strings.Unbounded;
package get_stdin is
type IntegerArray is array (Natural range <>) of Integer;
function get_ints return IntegerArray;
end get_stdin;
get_stdin.adb:
with Ada.Text_IO;
with Ada.Text_IO.Unbounded_IO;
with Ada.Strings.Unbounded;
with Ada.Strings;
package body get_stdin is
function get_ints return IntegerArray is
Counter : Natural := 0;
Str : Ada.Strings.Unbounded.Unbounded_String;
Arr : IntegerArray(0..10000);
begin
while not Ada.Text_IO.End_Of_File loop
Str := Ada.Text_IO.Unbounded_IO.Get_Line;
Arr(Counter) := Integer'Value(Ada.Strings.Unbounded.To_String(Str));
Counter := Counter + 1;
end loop;
return Arr(0..Counter-1);
end get_ints;
end get_stdin;
Я звоню, используя этот пакет внутри этой процедуры:
procedure d1 is
StdinArr : get_stdin.IntegerArray := get_stdin.get_ints;
begin
null; -- Array processing to follow
end;
Это успешно компилируется, и я затем передаю в свой входной текстовый файл:
me@mypc /cygdrive/c/Users/me/aoc2018
$ cat d1.txt
-6
-1
-18
-10
...etc
me@mypc /cygdrive/c/Users/me/aoc2018
$ cat d1.txt | ./d1.exe
raised CONSTRAINT_ERROR : bad input for 'Value: "-6"
"- 6" - первое значение в текстовом файле.Мой код преобразования строки в целое число был по существу скопирован с этого вопроса .
- Я не уверен, почему возникает неправильная ошибка ввода.
- Это вызываетта же ошибка, если я заменил -6 положительным целым числом в файле
- Это работает под Cygwin в Windows 10.
- Скомпилировано / связано с
gnatmake
версия 7.3.0
Примечание: я только начинаю работать с Ada, поэтому, вероятно, у меня вообще много проблем с кодом.
Что я делаю неправильно и как я могу это исправитьэта функция / пакет возвращает мой IntegerArray
тип, правильно заполненный Integer
s?