Ada 编译器赢了’;I don’我拿不到绳子

Ada 编译器赢了’;I don’我拿不到绳子,ada,Ada,一位用户最近发布了一个问题,并将其删除(可能是因为我们不太欢迎)。实际上,这就是问题所在:使用gnatmake-gnatwlperson_1.adb编译,结果是 1. with Ada.Text_IO; use Ada.Text_IO; 2. with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; 3. procedure Person_1 is 4.

一位用户最近发布了一个问题,并将其删除(可能是因为我们不太欢迎)。实际上,这就是问题所在:使用
gnatmake-gnatwlperson_1.adb
编译,结果是

     1. with Ada.Text_IO;                    use Ada.Text_IO;
     2. with Ada.Integer_Text_IO;            use Ada.Integer_Text_IO;
     3. procedure Person_1 is
     4.    type String is
     5.      array (Positive range <>) of Character;
     6.    S: String (1..10);
     7. begin
     8.    Put("Write a name: ");
     9.    Get(S);
           1   6
        >>> no candidate interpretations match the actuals:
        >>> missing argument for parameter "Item" in call to "Get" declared at a-tiinio.ads:90, instance at a-inteio.ads:18
        >>> missing argument for parameter "Item" in call to "Get" declared at a-tiinio.ads:51, instance at a-inteio.ads:18
        >>> missing argument for parameter "Item" in call to "Get" declared at a-textio.ads:451
        >>> missing argument for parameter "Item" in call to "Get" declared at a-textio.ads:378
        >>> expected type "Standard.Integer"
        >>> found type "String" defined at line 4
        >>>   ==> in call to "Get" at a-tiinio.ads:59, instance at a-inteio.ads:18
        >>>   ==> in call to "Get" at a-textio.ads:454
        >>>   ==> in call to "Get" at a-textio.ads:381

    10. end Person_1;
1。使用Ada.Text_IO;使用Ada.Text\u IO;
2.使用Ada.Integer\u Text\u IO;使用Ada.Integer\u Text\u IO;
3.程序人员_1为
4.类型字符串为
5.字符数组(正范围);
6.S:字符串(1..10);
7.开始
8.放(“写一个名字:”);
9取得(S);;
1   6
>>>没有与实际情况相匹配的候选解释:
>>>在a-tiinio.ads:90处声明的“Get”调用中缺少参数“Item”的参数,在a-inteio.ads:18处声明实例
>>>在a-tiinio.ads:51处声明的“Get”调用中缺少参数“Item”的参数,在a-inteio.ads:18处声明实例
>>>在a-textio声明的“Get”调用中缺少参数“Item”的参数。ads:451
>>>在a-textio声明的“Get”调用中缺少参数“Item”的参数。ads:378
>>>应为类型“Standard.Integer”
>>>找到第4行定义的类型“String”
>>>==>在a-tiinio调用“获取”。ads:59,在a-inteio实例。ads:18
>>>==>在a-textio呼叫“获取”。广告:454
>>>==>在a-textio呼叫“获取”。ads:381
10最终用户1;

这很令人困惑。发生了什么事?

问题是,此代码定义了自己的类型
字符串
,它隐藏了标准类型
字符串
Ada.Text\u IO.Get
需要一个标准
String
类型的参数,但实际上它被赋予了一个本地
String
类型的参数

报告说,在要点名称等效下

当且仅当两个类型具有相同名称时,两个类型才兼容;如果它们恰好具有相同的大小或位表示,则不会。因此,您可以声明两个具有完全不兼容的相同范围的整数类型,或两个具有完全相同组件但不兼容的记录类型

但是,这两种类型确实有相同的名称!(
字符串
)。不是吗

毕竟,它们没有这样做的原因是完全限定名实际上是不同的
Get
需要
Standard.String
(),但本地版本是
Person\u 1.String

您可能希望
-gnatwh
(打开隐藏声明的警告)会报告此情况,但不幸的是没有

我不知道为什么编译器只在
Ada.Integer\u Text\u IO
(with
Integer
)中报告失败的匹配;如果我们用和使用删除这个
(毕竟它没有被使用),事情会变得更有帮助

     1. with Ada.Text_IO;                    use Ada.Text_IO;
     2. --  with Ada.Integer_Text_IO;            use Ada.Integer_Text_IO;
     3. procedure Person_1 is
     4.    type String is
     5.      array (Positive range <>) of Character;
     6.    S: String (1..10);
     7. begin
     8.    Put("Write a name: ");
     9.    Get(S);
           1   4
        >>> no candidate interpretations match the actuals:
        >>> missing argument for parameter "Item" in call to "Get" declared at a-textio.ads:451
        >>> missing argument for parameter "Item" in call to "Get" declared at a-textio.ads:378
        >>> expected type "Standard.String"
        >>> found type "String" defined at line 4
        >>>   ==> in call to "Get" at a-textio.ads:454
        >>>   ==> in call to "Get" at a-textio.ads:381

    10. end Person_1;
1。使用Ada.Text_IO;使用Ada.Text\u IO;
2. --  使用Ada.Integer\u Text\u IO;使用Ada.Integer\u Text\u IO;
3.程序人员_1为
4.类型字符串为
5.字符数组(正范围);
6.S:字符串(1..10);
7.开始
8.放(“写一个名字:”);
9取得(S);;
1   4
>>>没有与实际情况相匹配的候选解释:
>>>在a-textio声明的“Get”调用中缺少参数“Item”的参数。ads:451
>>>在a-textio声明的“Get”调用中缺少参数“Item”的参数。ads:378
>>>应为类型“Standard.String”
>>>找到第4行定义的类型“String”
>>>==>在a-textio呼叫“获取”。广告:454
>>>==>在a-textio呼叫“获取”。ads:381
10最终用户1;