Как я могу преобразовать неограниченную строку в целое число? - PullRequest
0 голосов
/ 17 декабря 2018

Я изучаю Аду (пытаясь решить задачи 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?

1 Ответ

0 голосов
/ 17 декабря 2018

Это была проблема с окончанием строки.Я работал под управлением cygwin в Windows 10. Мой текстовый файл имеет окончания строки в стиле Windows.

Использование dos2unix:

$ cat d1.txt | dos2unix.exe | ./d1.exe

было достаточно для правильной работы.

Если кто-нибудь может точно объяснить, почему, это было бы интересно.Я предполагаю, что Get_Line удаляет только символ \n, а не \r.

...