Ada 如何定义包含两个多维无约束数组的结构并将其传递给过程

Ada 如何定义包含两个多维无约束数组的结构并将其传递给过程,ada,Ada,我是Ada的新手,所以我有一个问题:如何定义一个包含两个多维无约束数组的结构并将其传递给一个过程。 下面是我编写的代码: 软件包SDR_处理为 --------------------------------------- -常数- --------------------------------------- 地理空间速度:恒定自然速度=1-数据类型 --------------------------------------- 类型切片_指针是整数的数组正范围; 类型区域为数组正范围、正范围

我是Ada的新手,所以我有一个问题:如何定义一个包含两个多维无约束数组的结构并将其传递给一个过程。 下面是我编写的代码:

软件包SDR_处理为 --------------------------------------- -常数- --------------------------------------- 地理空间速度:恒定自然速度=1-数据类型 --------------------------------------- 类型切片_指针是整数的数组正范围; 类型区域为数组正范围、正范围、整数的正范围; 记录类型位置和速度区域 区域标识:自然:=0; SP:切片指针; 钻机:区域; 结束记录; 程序SDR_编码LSR:输入输出位置和速度区域; 结束SDR_治疗; --------------------------------------- 包体:

使用Ada.Text_IO;使用Ada.Text\u IO; 包装体SDR_处理为 程序SDR编码LSR:输入输出位置和速度 -lsr:钻机; 开始 Ada.Text_IO.Put_line编码SDR。。。; 结束SDR_编码; 结束SDR_治疗; _____________________________________________________________________________ 这是我从编译器得到的错误

C:\GNAT\2017\bin\src\sdr\u treatment.ads 18:11组件声明中的无约束子类型 19:12组件声明中的无约束子类型


提前感谢:-

您应该将您的声明视为中的C数组

记录类型位置和速度区域 区域标识:自然:=0; SP:切片指针; 钻机:区域; 结束记录; 这里,您试图声明一个在编译时不知道其静态组件大小的记录,这几乎与声明相同

结构{ 字符int[]; }; 如果您希望它更加动态,同时避免使用访问(即指针),请查看


如果您喜欢使用动态分配的内存,请使用

您应该将您的声明视为

记录类型位置和速度区域 区域标识:自然:=0; SP:切片指针; 钻机:区域; 结束记录; 这里,您试图声明一个在编译时不知道其静态组件大小的记录,这几乎与声明相同

结构{ 字符int[]; }; 如果您希望它更加动态,同时避免使用访问(即指针),请查看


如果您喜欢使用动态分配的内存,请使用

,正如编译器所说,您不能使用无约束的子类型声明记录组件

作为记录声明的一部分,您必须修复约束:

软件包SDR_处理为 类型切片_指针是整数的数组正范围; 类型区域是数组的正范围, 正范围, 整数的正范围; 类型位置和速度区域低:正; 高:天然; X_低:正; X_高:天然; Y_低:正; Y_高:自然; Z_低:正; Z_High:自然就是 记录 区域标识:自然:=0; SP:切片指针低。。高的 钻机:区域X_低。。X_高, 你低。。尤高,, Z_Low。。Z_高; 结束记录; 结束SDR_治疗;
正如编译器所说,您不能声明具有无约束子类型的记录组件

作为记录声明的一部分,您必须修复约束:

软件包SDR_处理为 类型切片_指针是整数的数组正范围; 类型区域是数组的正范围, 正范围, 整数的正范围; 类型位置和速度区域低:正; 高:天然; X_低:正; X_高:天然; Y_低:正; Y_高:自然; Z_低:正; Z_High:自然就是 记录 区域标识:自然:=0; SP:切片指针低。。高的 钻机:区域X_低。。X_高, 你低。。尤高,, Z_Low。。Z_高; 结束记录; 结束SDR_治疗;
此外,我将提供一种构造函数来提供参数的前提条件。这将避免cr
例如,当X_Low大于X_hi Jacob时,使用空数组,谢谢您的回答。我完全按照您显示的那样做了,但编译器退出时显示以下消息:gprbuild-ws-c-f-u-PC:\GNAT\2017\bin\training.gpr sdr\u treatment.ads Compile[Ada]sdr\u treatment.ads无法为文件sdr\u treatment.ads包规范gprbuild生成代码:**编译阶段失败[2018-05-16:22:28]进程退出,状态为4,运行时间:05.41s。我不明白怎么了!?没什么不对的。编译器只是给你一个稍微让人困惑的信息。它说的是,它不会为包生成任何目标代码,这是完全合理的,因为它不会声明任何操作,除了隐式函数=。一旦您向包规范添加一些子程序规范,编译器将查找包体并尝试生成目标代码。实际上,Jacob,你的代码编译得很好。如果它不能为Sasha编译,那么他的代码和你的代码就不一样了。Sasha,正如Jacob指出的,这个消息通常意味着包需要一个主体,例如,规范中声明了一个子程序。事实上,如果规范不需要主体,那么提供主体是非法的。此外,我会提供一种构造函数来提供参数的先决条件。例如,当X_Low大于X_hi Jacob时,这将避免创建空数组,谢谢您的回答。我完全按照您显示的那样做了,但编译器退出时显示以下消息:gprbuild-ws-c-f-u-PC:\GNAT\2017\bin\training.gpr sdr\u treatment.ads Compile[Ada]sdr\u treatment.ads无法为文件sdr\u treatment.ads包规范gprbuild生成代码:**编译阶段失败[2018-05-16:22:28]进程退出,状态为4,运行时间:05.41s。我不明白怎么了!?没什么不对的。编译器只是给你一个稍微让人困惑的信息。它说的是,它不会为包生成任何目标代码,这是完全合理的,因为它不会声明任何操作,除了隐式函数=。一旦您向包规范添加一些子程序规范,编译器将查找包体并尝试生成目标代码。实际上,Jacob,你的代码编译得很好。如果它不能为Sasha编译,那么他的代码和你的代码就不一样了。Sasha,正如Jacob指出的,这个消息通常意味着包需要一个主体,例如,规范中声明了一个子程序。事实上,如果规范不需要主体,那么提供主体是非法的。