type T is array ("A" .. "F") of Integer;
hello.adb:4:22: discrete type required for range
如果我的理解是正确的,Ada参考手册的chapter 3.6中的第9条是编译器引发编译错误的原因:
array_type_definition中的每个index_subtype_definition或discrete_subtype_definition定义索引子类型;它的类型(索引类型)应该是离散的。
因此,为什么"A" .. "F"
不是discrete
? discrete
到底意味着什么?
下面引用了数组类型定义的语法要求。资料来源:Ada Reference Manual
array_type_definition ::= unconstrained_array_definition | constrained_array_definition
constrained_array_definition ::= array (discrete_subtype_definition {, discrete_subtype_definition}) of component_definition
discrete_subtype_definition ::= discrete_subtype_indication | range
range ::= range_attribute_reference | simple_expression .. simple_expression
simple_expression ::= [unary_adding_operator] term {binary_adding_operator term}
term ::= factor {multiplying_operator factor}
factor ::= primary [** primary] | abs primary | not primary
primary ::= numeric_literal | null | string_literal | aggregate | name | qualified_expression | allocator | (expression)
答案 0 :(得分:8)
此:
"A" .. "F"
确实满足range
的语法;它由simple_expression
组成,后跟..
,后跟另一个simple_expression
。所以它不是语法错误。
它仍然无效;特别是它是语义错误。语法不是决定一块代码是否有效的唯一因素。例如,"foo" * 42
是一个语法上有效的表达式,但它在语义上无效,因为字符串和整数没有*
运算符(除非你自己编写)。 / p>
离散类型是整数类型或枚举类型。 Integer
,Character
和Boolean
是离散类型的示例。浮点类型,数组类型,指针类型,记录类型等不是离散类型,因此这些类型的表达式不能用于discrete_subtype_indication
的范围。
此:
type T is array ("A" .. "F") of Integer;
可能应该是:
type T is array ('A' .. 'F') of Integer;
字符串文字的类型为String
,这是一种数组类型。字符文字属于Character
类型,它是枚举类型,因此是离散类型。
您在另一个答案的评论中写道:
不幸的是,我无法用字符文字替换字符串文字并重新编译代码......
如果是这样的话,那很不幸。您发布的代码无效;它不会编译。您唯一的选择是修改或不使用它。
答案 1 :(得分:4)
嗯...我认为它试图告诉你,你不能使用字符串文字来指定范围。你可能想要使用一个字符文字。
参考:
毕竟,上面引用的条款明确要求使用string_literal
您误解了Ada语法规范。具体来说,你错过了这个产品:
name ::= simple_name
| character_literal | operator_symbol
| indexed_component | slice
| selected_component | attribute