Ширина целочисленного изображения () по умолчанию в Аде

Как я могу изменить ширину целочисленного изображения () по умолчанию в Аде?

Я хотел бы иметь возможность делать такие вещи, как put("this is a number: " & i'img); с i, например, 5, и чтобы Ада выводила число без лишних пробелов.

В настоящее время я должен сделать put("this is a number: "); put(i, 0);...

Есть ли способ обойти это?

Кстати, я знаю, что X'img это расширение комара :)


person pwseo    schedule 28.07.2011    source источник
comment
Ответ на аналогичный вопрос здесь: stackoverflow.com/questions/1846737/   -  person Marc C    schedule 30.07.2011


Ответы (4)


Попробуйте что-то вроде:

Package K is
    Type New_Type is New Integer;
private
  Function Image( Item : In New_Type ) Return String;
End K;

Package Body K is
  Use Ada.Text_IO;

  Function Image( Item : In New_Type ) Return String is
    begin
        Return ("This is a number: " &  Integer'Image(Integer(Item)) );
        -- You could also add a local integer variable, say Integer_Value,
        -- initialized to Integer(Item) and then use Integer_Value'Img.
    end Image;
End K;
person Shark8    schedule 29.07.2011
comment
для чего Use Ada.Text_IO;? - person Rommudoh; 29.07.2011
comment
Ada.Text_IO — это предопределенный пакет для текстовых функций ввода и вывода; он содержит Put_Line, который используется в примере функции изображения. - person Shark8; 29.07.2011
comment
Ой! LOL - я использовал его при тестировании «Изображение... Пакет K находился внутри процедуры, которая объявляла переменную K.New_Type; Думаю, я забыл удалить его после того, как убедился, что он работает должным образом. - person Shark8; 02.08.2011

То, как вы это делаете сейчас, обеспечивает наибольшую гибкость; использование 'Image или 'Img всегда включает пробел для положительных значений и «–» для отрицательных значений. §A.10.8 Ввод-вывод для целого числа Типы показывает Put процедуры, доступные в универсальном пакете Ada.Text_IO.Integer_IO. Вы можете создать его самостоятельно:

package Ada.Integer_Text_IO is new Ada.Text_IO.Integer_IO(Integer);

В качестве альтернативы вы можете использовать предопределенный экземпляр, предписанный стандартом; переименование может быть удобным:

with Ada.Integer_Text_IO;
package Int_IO renames Ada.Integer_Text_IO;

Для удобства вы можете определить функцию, которая возвращает String, и использовать ее с ссылкой String оператор конкатенации, &.

person trashgod    schedule 29.07.2011
comment
@oenone: 'Image часто встречается в реализации таких пакетов, как Ada.Calendar.Formatting и Ada.Text_IO.Editing, среди прочих. Можете ли вы уточнить? - person trashgod; 29.07.2011

функция Img (X: Integer) возвращает строку (Ada.Strings.Fixed.Trim (X'Img, Ada.Strings.Both));

person Marius Amado-Alves    schedule 17.06.2021

Просто написать свою собственную функцию изображения?

function Image (X : in Integer) return String is
    Img : constant String := Integer'Image (X);
begin
    if X < 0 then
        return Img;
    else
        return Img (2 .. Img'Length);
    end if;
end Image;

тогда вы можете просто пойти:

put("this is a number: " & Image (i));
person dave    schedule 01.08.2011