Ada get_line массивов (1..5) строки (1..10)

У меня проблема. Я создал массив строк, потому что хочу сохранить некоторые имена в массиве. Проблема в том, что когда я пишу имя короче 10 символов, программа заполняет массив случайными символами до 10. И я не знаю, как это решить. Я пробовал использовать Ada.Text_IO.Skip_Line, но он все еще не работает так, как я хочу. (Проблема взята из экзамена, на котором мы предполагали хранить 5 наименований на револьверах :) ..)

Это код

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

procedure Revolver is

   type Pistol is array (1..5) of String(1..10);

   procedure Get_namn(Namn: out  Pistol) is
      X:Integer;
      pist:String(1..10);
   begin
      New_Line;
      for I in 1..5 loop
         Get_line(Pist,x);
         if pist'Last=x then
            Skip_Line;
         end if;

         Namn(I):= Pist;
      end loop;

      New_Line;
   end Get_Namn; 

   procedure Put_Namn(Namn: in Pistol) is
   begin
      for I in Namn'range loop
         Put(Namn(I));
         New_Line;
      end loop;
   end Put_Namn;

   Namn : Pistol;
   X    : Integer;
begin
   Put("Mata in revolvrar: ");
   Get_namn(Namn);
   Put_Namn(Namn);
end Revolver;
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
0
319
2

Ответы 2

Вы можете решить проблему, инициализировав строки, заполнив их пробелами. - За исключением того, что Get_Line указан как имеющий Item в качестве параметра out. - Придерживайтесь струн фиксированной длины с наполнителем:

declare
   Buffer    : String (1 .. 20);
   Filled_To : Natural;
begin
   Ada.Text_IO.Get_Line (Item => Buffer,
                         Last => Filled_To);
   Buffer (Filled_To + 1 .. Buffer'Last) := (others => ' ');
end;

Другой вариант - отслеживать фактическую длину и показывать только ее, когда вы снова распечатываете имена.

Третий вариант - использовать Ada.Strings.Bounded, который отслеживает длину за вас.

Четвертый вариант - использовать Ada.Strings.Unbounded, который использует динамическое выделение для настройки длины сохраненной строки в соответствии с вашими потребностями.

Какое из четырех решений является правильным, не ясно из вашего описания проблемы, но первое проще всего реализовать.

Спасибо! Но как мне заполнить массив пробелами?

Louise Hjalmarson 04.08.2018 21:13

Я не верю, что можно полагаться на "заполнение [...] пробелами". ARM A.7.1 (19) говорит в конце параграфа «Значения не назначенных символов не указаны».

Simon Wright 04.08.2018 21:47

Чтобы заполнить пробелы, посмотрите процедуру перемещения для фиксированной строки ARM A.4.3 (7)

Frédéric Praca 06.08.2018 12:06

@LouiseHjalmarson Я расширил ответ небольшим количеством кода, который гарантирует, что у вас есть пробелы в оставшейся части строки фиксированной длины, в которую вы читаете строку.

Jacob Sparre - at CLDK 14.08.2018 14:41

Хорошо, вы видите результат определения вашего типа:

 type Pistol is array (1..5) of String(1..10);

Видите ли, вы объявляете массив из пяти элементов, которые представляют собой строки длиной 10.

Кто-то уже упоминал ограниченные и неограниченные строки, но, возможно, вам следует взглянуть на Ada.Containers.Indefinite_Holders, создать его экземпляр с помощью String и создать элементы массива из этого контейнера.

Другие вопросы по теме