Ширина целочисленного изображения () по умолчанию в Ada - PullRequest
2 голосов
/ 29 июля 2011

Как я могу изменить стандартную ширину integer'image () в Ada?

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 29 июля 2011

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

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;
2 голосов
/ 29 июля 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, &.

0 голосов
/ 01 августа 2011

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

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));
...