Ada 通用类型图像属性
Ada Generic Type Image Attribute
我目前正在大学实时编程语言课程中学习 Ada,对泛型有疑问。
我有一个通用程序csv_put
package PSU_Logging is
type logged_signal_names_t is (
t,
U_V1,
I_L1,
U_C1,
I_L2,
U_C2,
I_Load
);
private
... Some types, tasks and subprogramms ...
generic
type Item_Type_t is private;
procedure csv_put (File : in File_Type; Item : in Item_Type_t);
end PSU_Logging;
定义
package body PSU_Logging is
procedure csv_put (File : in File_Type; Item : in Item_Type_t) is
begin
Put (File, Item_Type_t'Image (Item));
Put (File, ", ");
end csv_put;
procedure csv_put_float is new csv_put (Item_Type_t => Float);
procedure csv_put_duration is new csv_put (Item_Type_t => Duration);
procedure csv_put_signal_name is new csv_put (Item_Type_t => logged_signal_names_t);
... Definition of other things ...
end PSU_Logging;
到目前为止一切顺利。太糟糕了,我在编译过程中遇到以下错误
Compile
[Ada] psu_logging.adb
psu_logging.adb:9:18: prefix of "image" attribute must be a scalar type or a scalar object name
gprbuild: *** compilation phase failed
有什么想法吗?我认为我可以像使用任何其他类型一样在泛型过程中使用泛型类型。因为我所有的实例都使用标量类型,所以我认为这应该不是问题。
顺便说一句:您最喜欢的 Ada 教程/参考资料是什么?我喜欢 Ada 上的 Wikibooks 页面,但尚未完成。
一个可能的解决方法(请原谅我的资本重组,这是我的编辑器的设置方式):提供 Image
作为通用参数,
generic
type Item_Type_T is private;
with function Image (Item : Item_Type_T) return String;
procedure Csv_Put (File : in File_Type; Item : in Item_Type_T);
procedure Csv_Put (File : in File_Type; Item : in Item_Type_T) is
begin
Put (File, Image (Item));
Put (File, ", ");
end Csv_Put;
并在可用的情况下使用 ’Image
进行实例化,否则使用您自己的实例化:
procedure Csv_Put_Float is new Csv_Put (Item_Type_T => Float,
Image => Float'Image);
除了询问上面已回答的如何执行此操作之外,您似乎还想知道为什么它会以这种方式工作。通用正式类型
type Item_Type_T is private;
可以使用具有赋值和“=”的任何实际类型实例化。这涵盖了多种类型,并非所有类型都是标量。泛型必须对所有可能的实际类型都是合法的。由于“图像对于某些可能的实际类型是不合法的,因此您不能在泛型中将其用于此类型。
我目前正在大学实时编程语言课程中学习 Ada,对泛型有疑问。
我有一个通用程序csv_put
package PSU_Logging is
type logged_signal_names_t is (
t,
U_V1,
I_L1,
U_C1,
I_L2,
U_C2,
I_Load
);
private
... Some types, tasks and subprogramms ...
generic
type Item_Type_t is private;
procedure csv_put (File : in File_Type; Item : in Item_Type_t);
end PSU_Logging;
定义
package body PSU_Logging is
procedure csv_put (File : in File_Type; Item : in Item_Type_t) is
begin
Put (File, Item_Type_t'Image (Item));
Put (File, ", ");
end csv_put;
procedure csv_put_float is new csv_put (Item_Type_t => Float);
procedure csv_put_duration is new csv_put (Item_Type_t => Duration);
procedure csv_put_signal_name is new csv_put (Item_Type_t => logged_signal_names_t);
... Definition of other things ...
end PSU_Logging;
到目前为止一切顺利。太糟糕了,我在编译过程中遇到以下错误
Compile
[Ada] psu_logging.adb
psu_logging.adb:9:18: prefix of "image" attribute must be a scalar type or a scalar object name
gprbuild: *** compilation phase failed
有什么想法吗?我认为我可以像使用任何其他类型一样在泛型过程中使用泛型类型。因为我所有的实例都使用标量类型,所以我认为这应该不是问题。
顺便说一句:您最喜欢的 Ada 教程/参考资料是什么?我喜欢 Ada 上的 Wikibooks 页面,但尚未完成。
一个可能的解决方法(请原谅我的资本重组,这是我的编辑器的设置方式):提供 Image
作为通用参数,
generic
type Item_Type_T is private;
with function Image (Item : Item_Type_T) return String;
procedure Csv_Put (File : in File_Type; Item : in Item_Type_T);
procedure Csv_Put (File : in File_Type; Item : in Item_Type_T) is
begin
Put (File, Image (Item));
Put (File, ", ");
end Csv_Put;
并在可用的情况下使用 ’Image
进行实例化,否则使用您自己的实例化:
procedure Csv_Put_Float is new Csv_Put (Item_Type_T => Float,
Image => Float'Image);
除了询问上面已回答的如何执行此操作之外,您似乎还想知道为什么它会以这种方式工作。通用正式类型
type Item_Type_T is private;
可以使用具有赋值和“=”的任何实际类型实例化。这涵盖了多种类型,并非所有类型都是标量。泛型必须对所有可能的实际类型都是合法的。由于“图像对于某些可能的实际类型是不合法的,因此您不能在泛型中将其用于此类型。