热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

当Vector包含字符串时,“Element_Type”的Ada实际错误必须是一个确定的子类型

如何解决《当Vector包含字符串时,“Element_Type”的Ada实际错误必须是一个确定的子类型》经验,为你挑选了1个好方法。

我的目标是使用括号表示法来打印带有N个节点的所有形式的树,可以根据上下文无关的语法定义如下:

?树是空的

?(TT)具有左右子节点的节点

例如,所有具有3个节点的树将如下所示:

((((。)。)。)

((。(。))。)

((。)。(。))

(。((。)。))

(。(。(。)))

我用Ada编写了以下代码,

with Ada.Containers; use Ada.Containers;
with Ada.Containers.Vectors;

with Ada.Text_IO; use Ada.Text_IO;

with Ada.Command_Line;
procedure Ass1 is 
     X: Positive := Positive'Value(Ada.Command_Line.Argument(1));
    package String_Vectors is new Ada.Containers.Vectors
     (Index_Type   => Natural,
      Element_Type => String);

    function tree(N: Integer) return String_Vectors.Vector is
    Strings : String_Vectors.Vector;    
    begin
        if N = 1 then
            Strings.Append("(.)");
            return Strings;
        end if;
        for T in tree(N - 1).Iterate loop
            Strings.Append("(" & T & ".)");
            Strings.Append("(." & T & ")");
        end loop;
    return Strings;
    end tree;


begin
    Ada.Text_IO.Put_Line(Ass1(X));
end;

但是我得到这个错误:

ass1.adb:9:09: instantiation error at a-convec.ads:375
ass1.adb:9:09: unconstrained element type in array declaration
ass1.adb:11:27: actual for "Element_Type" must be a definite subtype
ass1.adb:21:36: invalid operand types for operator "&"
ass1.adb:22:37: invalid operand types for operator "&"
ass1.adb:29:16: no candidate interpretations match the actuals:
ass1.adb:29:16: missing argument for parameter "Item" in call to "Put_Line" declared at a-textio.ads:259
ass1.adb:29:26: expected type "Standard.String"
ass1.adb:29:26: found private type "Ada.Containers.Vectors.Vector" from instance at line 9
ass1.adb:29:26:   ==> in call to "Put_Line" at a-textio.ads:263
x86_64-linux-gnu-gnatmake-7: "ass1.adb" compilation error

什么是定型子类型,为什么String不是一个子类型?我认为&用于Ada中的字符串连接。

---------编辑----------我根据答案将代码更改为以下内容:

with Ada.Containers; use Ada.Containers;
with Ada.Containers.Indefinite_Vectors;

with Ada.Text_IO; use Ada.Text_IO;

with Ada.Command_Line;
procedure Tree is
         X: Positive := Positive'Value(Ada.Command_Line.Argument(1));
        package String_Vectors is new Ada.Containers.Indefinite_Vectors
         (Index_Type   => Natural,
          Element_Type => String);

        function Tree(N: Integer) return String_Vectors.Vector is
        Strings : String_Vectors.Vector;
        begin
            if N = 1 then
                Strings.Append("(.)");
                return Strings;
            end if;
            for T in Tree(N - 1).Iterate loop
                Strings.Append("(" & T & ".)");
                Strings.Append("(." & T & ")");
            end loop;
        return Strings;
        end Tree;


begin
    Ada.Text_IO.Put_Line(Tree(X));
end;

但是我仍然收到以下错误:

gnatmake tree.adb 6
gcc -c tree.adb
tree.adb:21:36: invalid operand types for operator "&"
tree.adb:22:37: invalid operand types for operator "&"
tree.adb:29:16: no candidate interpretations match the actuals:
tree.adb:29:16: missing argument for parameter "Item" in call to "Put_Line" declared at a-textio.ads\
:498
tree.adb:29:26: expected type "Standard.String"
tree.adb:29:26: found private type "Ada.Containers.Indefinite_Vectors.Vector" from instance at line \
9
tree.adb:29:26:   ==> in call to "Put_Line" at a-textio.ads:508
gnatmake: "tree.adb" compilation error

操作数问题仍然存在。根据文档,Put_Line可以接受一个参数,那么为什么缺少参数?而且我也不理解私有类型“ Indefinite_Vectors.Vector”错误。



1> thindil..:

确定子类型是其大小在编译时已知的子类型。有关它的更多信息,请参见Ada Wikibooks。您的String没有声明的长度,因此是不确定的类型。

解决方案:

    如果您知道将存储在Vector中的String的大小,则可以对其进行声明,例如:

    package String_Vectors is new Ada.Containers.Vectors
     (Index_Type   => Natural,
      Element_Type => String(1 .. 20));

    请改用Unbounded_String,这也将需要更改您的其他代码(在各处使用Unbounded_String或将其强制转换为String):

    package String_Vectors is new Ada.Containers.Vectors
     (Index_Type   => Natural,
      Element_Type => Unbounded_String);

    使用Indefinite_Vector而不是Vector:

    package String_Vectors is new Ada.Containers.Indefinite_Vectors
     (Index_Type   => Natural,
      Element_Type => String);

所有下一个错误(也是带有“&”的错误)都是第一个问题的错误定义,该错误定义了String_Vectors。


更新到新版本的问题:

这里仍然需要注意的几件事:

    追加(第21和22行)-当您想将一种类型添加到另一种类型(在您的示例中是字符串和矢量光标)时,必须将其中一种强制转换为另一种。因此,此行应如下所示:

Strings.Append("(" & Natural'Image(String_Vectors.To_Index(T)) & ".)");

首先,将向量Cursor转换为Natural,然后将其转换为String,以便可以将它们连接起来。

    Put_Line(第29行)-在Ada中,您不能以这种方式打印Vectors(如果我很好猜,这就是您想要做的吗?)如果要打印vector的内容,则必须打印其每个元素:

for Item of Tree(X) loop
   Put_Line(Item);
end loop;

其他错误应该再次受到这两个问题的影响(至少所有内容对我来说都是编译正常的)。


(3)几乎可以肯定是最好的。进行此更改后,您会发现更多有趣的错误!
推荐阅读
  • Linuxchmod目录权限命令图文详解在Linux文件系统模型中,每个文件都有一组9个权限位用来控制谁能够读写和执行该文件的内容。对于目录来说,执行位的作用是控制能否进入或者通过 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文主要讨论了在xps15上安装双系统win10和MacOS后,win10无法正常更新的问题。分析了可能的引导问题,并提供了解决方法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 树莓派Linux基础(一):查看文件系统的命令行操作
    本文介绍了在树莓派上通过SSH服务使用命令行查看文件系统的操作,包括cd命令用于变更目录、pwd命令用于显示当前目录位置、ls命令用于显示文件和目录列表。详细讲解了这些命令的使用方法和注意事项。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
author-avatar
菲菲鱼2009
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有