record - Ada 重叠标签字段
问题描述
这是我的类型:
package MyPackage is
Type T_MyType is record
Field1 : Uint16;
Field2 : Uint32;
Field3 : Uint8;
Field4 : Uint8;
end record;
private
for T_MyType'Alignment use 4;
for T_MyType'Size use 64;
for T_MyType use record
Field1 at 16#00# range 0 .. 15;
Field2 at 16#02# range 0 .. 31;
Field3 at 16#06# range 0 .. 7;
Field4 at 16#06# range 8 .. 15:
end record
end package
我没有错误,但是如果我将类型更改Type T_MyType is tagged record
为第一行,则会出现错误:
组件与“T_MyType”的标签字段重叠
标记记录是否有隐藏字段?如何使用标记记录保存我的地址?
解决方案
假设您使用的是 GNAT,GNAT RM 的这一章是相关的:
标记类型的标记字段总是在记录的开头占据一个地址大小的字段。任何组件子句都不得尝试覆盖此标记。
所以你需要为标签字段保存存储空间,像这样:
-- Standard'Address_Size is GNAT-specific and needed here since
-- System.Address'Size is not static. This length is in storage units.
Tag_Length : constant := Standard'Address_Size / System.Storage_Unit;
for T_MyType'Size use Standard'Address_Size + 64;
for T_MyType use record
Field1 at Tag_Length + 16#00# range 0..15;
Field2 at Tag_Length + 16#02# range 0..31;
Field3 at Tag_Length + 16#06# range 0..7;
Field4 at Tag_Length + 16#06# range 8..15;
end record;
推荐阅读
- docker - Docker is pulling image from remote registry but I want to use a local image
- sql-server - Stored procedure output into Java custom Object using Spring boot and JPA
- scala - 使用替代 API 并明确指定字符集名称或字符集对象
- prolog - Prolog uncaught exception: error(existence_error(procedure,a/0),top_level/0)
- node.js - JSON stringify 返回 [object Object]
- regex - how to extract the string from two delimiter strings using sed or awk or bash?
- c# - Add Default action in the route attribute
- c++ - What is wrong with the output of this attempt at dynamically resizing an array?
- python-3.x - 为什么我尝试提交表单返回“不是有效的日期时间值”
- javascript - 动态创建函数并将它们传递到 Google Docs 产品(Docs、Sheets 等)的自定义菜单中