Каков наилучший способ инициализации строки фиксированной длины в Ada? - PullRequest
0 голосов
/ 25 июня 2018

Я хочу инициализировать String фиксированной длины в Аде более или менее следующим образом:

S : String (1..256) := ("Hello", others => Character'Val (0));

Я получаю ошибку при попытке компиляции. Есть ли способ достичь чего-то похожего на вышеперечисленное?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Я бы обычно делал что-то вроде

Hello : constant String := "Hello";

Desired_Length : constant := 256;

S : String := Hello & (1 .. Desired_Length - Hello'Length => Character'Val (0) );

или

(Hello'Length + 1 .. Desired_Length => ...);
0 голосов
/ 25 июня 2018

Причина, по которой ваш код не компилируется, состоит в том, что String является массивом символов, поэтому эквивалент будет

s : String(1..256) := (1 => 'H',
                       2 => 'e',
                       3 => 'l',
                       4 => 'l',
                       5=> 'o',
                       others => Character'Val(0));

Что явно далеко от идеала.

Другой способ - использовать процедуру Move в Ada.Strings.Fixed .

.
Move(Target => s,
     Source => "Hello",
     Pad => Character'Val(0));

Но этого нельзя сделать в декларации.

Наконец, это компилируется:

s : String(1..256) := "Hello" & (6..256 => Character'Val(0));

Но я нахожу это менее ясным

...