Ada编程报错:第18行出现'Subtype mark required in this context'问题
解决Ada中'Subtype mark required in this context'错误
你遇到的这个错误根源很明确——Ada是强类型语言,Unbounded_String和普通字符串字面量(比如"!Close")属于不同类型,直接用not in比较会触发类型不兼容的编译错误。
问题拆解
在第18行的while input not in "!Close" loop里,input是Unbounded_String类型,而"!Close"是基础的String类型,编译器无法识别跨类型的这种比较操作,所以抛出了类型相关的报错。
两种可行修复方案
方案1:把字符串字面量转成Unbounded_String
用Ada.Strings.Unbounded.To_Unbounded_String函数将字面量转换为和input一致的类型,同时把not in替换为更适合单值比较的/=(不等于运算符):
with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with Ada.Text_IO.Unbounded_IO; use Ada.Text_IO.Unbounded_IO; procedure main is input : Unbounded_String; begin while input /= To_Unbounded_String("!Close") loop Get_Line(input); end loop; end main;
方案2:把Unbounded_String转成普通String
通过To_String函数将input转换为基础String类型,再和字面量比较:
with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with Ada.Text_IO.Unbounded_IO; use Ada.Text_IO.Unbounded_IO; procedure main is input : Unbounded_String; begin while To_String(input) /= "!Close" loop Get_Line(input); end loop; end main;
两种方案都能解决你的问题:如果后续代码还需要用到Unbounded_String的动态长度特性,方案1更适配;如果只是临时做内容比较,方案2的写法更简洁。
内容的提问来源于stack exchange,提问作者Bliwiker
相关产品推荐
相关产品推荐

