I'm using a library in ada which contains many types :
type Int8 is range -8 ** 7 .. 2 ** 7 - 1;
subtype T_Name_String is Int8;
type T_Name_String_Fixed20 is array (range 1..20) of T_Name_String ;
And there is a record with :
type The_Record is record
name : T_Name_String_Fixed20;
-- and others
end record;
I can't change that, I don't know why there are using Int8
for ada strings but I'm not able to initiate the field name
. I've try :
-- First try:
MyRecord.name = "hello ";
-- Error : expected type T_Name_String_Fixed20 found a string type
-- Second try
Ada.Strings.Fixed.Move(Target => MyRecord.name;
Source => "hello "
Adding to the answer from @Shark8, if you want to convert between real Strings and T_Name_String_Fixed20, you also have to convert between Character and T_Name_String. Here is some example code for that:
subtype String20 is String (1 .. 20);
function To_Name (S : String20)
return T_Name_String_Fixed20
-- Assumes that all characters in S have 'Pos < 128.
is
Result : T_Name_String_Fixed20;
begin
for K in Result'Range loop
Result(K) := T_Name_String (Character'Pos(S(K)));
end loop;
return Result;
end To_Name;
function To_String (N : T_Name_String_Fixed20)
return String20
-- Assumes that all values in N are >= 0.
is
Result : String20;
begin
for K in Result'Range loop
Result(K) := Character'Val (N(K));
end loop;
return Result;
end To_String;
You can test this by, for example,
Ada.Text_IO.Put_Line (To_String (To_Name ("Hello crazy world!!!")));
Note that the string argument to To_Name has to be exactly 20 characters long, as I have written that function (subtype String20). If you prefer, you can of course modify the function to take also shorter strings and eg. pad with blanks.