Ada库中基于Int8的字符串类型记录字段初始化求助
初始化基于Int8数组的自定义字符串字段
给定的库将字符串类型定义为Int8的固定长度数组,这和Ada原生的String类型(Character数组)不兼容,所以直接赋值字符串字面量或使用Ada.Strings.Fixed.Move都会报错。以下是两种可行的初始化方法:
方法一:手动逐个字符转换初始化
直接将每个字符的ASCII值转换为Int8类型,同时补全剩余位置为空格(适配20位长度):
MyRecord : The_Record := ( name => ( 1 => Int8(Character'Pos('h')), 2 => Int8(Character'Pos('e')), 3 => Int8(Character'Pos('l')), 4 => Int8(Character'Pos('l')), 5 => Int8(Character'Pos('o')), 6 .. 20 => Int8(Character'Pos(' ')) ), -- 初始化其他字段 );
方法二:编写转换函数复用
如果需要多次初始化这类字段,建议封装一个转换函数,自动处理字符串长度截断或补空格:
function String_To_T_Name_Fixed20(S : String) return T_Name_String_Fixed20 is Result : T_Name_String_Fixed20 := (others => Int8(Character'Pos(' '))); -- 默认填充空格 begin -- 遍历字符串,逐个转换为Int8,超出20位则截断 for I in 1 .. Integer'Min(S'Length, 20) loop Result(I) := Int8(Character'Pos(S(S'First + I - 1))); end loop; return Result; end String_To_T_Name_Fixed20;
使用该函数初始化字段:
MyRecord : The_Record := ( name => String_To_T_Name_Fixed20("hello"), -- 初始化其他字段 );
为什么之前的方法失败?
- 直接赋值字符串字面量:
"hello "是Ada原生String类型,和T_Name_String_Fixed20(Int8数组)类型不匹配,编译器无法自动转换。 Ada.Strings.Fixed.Move:该子程序仅支持Ada标准字符串类型(如String、Fixed_String)之间的转换,不兼容自定义的Int8数组类型。
内容的提问来源于stack exchange,提问作者A.Pissicat
相关产品推荐
相关产品推荐

