Ada:用可变大小的数组打包记录

2024-05-25

我正在寻找创建一个打包记录,它可以容纳长度从 5 - 50 个元素不等的数组。是否可以以这样的方式来完成此操作,以便可以在不浪费空间的情况下打包记录?当我去创建记录时,我会知道数组中有多少元素。

-- the range of the array
type Array_Range_T is Integer range 5 .. 50;

-- the array type
type Array_Type_T is array range (Array_Range_T) of Integer;

-- the record
type My_Record_T (Array_Length : Integer := 5) is
  record
    -- OTHER DATA HERE
    The_Array : Array_Type_T(Array_Length);
  end record;
-- Pack the record
for My_Record_T use
  record
    -- OTHER DATA
    The_Array at 10 range 0 .. Array_Length * 16;
  end record;

for My_Record_T'Size use 80 + (Array_Length * 16);

这显然不会编译,但显示了我正在尝试做的事情的精神。如果可能的话,我想将数组的长度保留在记录之外。

谢谢你!


Ada 中确实没有办法按照您要求的方式表示记录。但是,由于您真正关心的不是记录在内存中的表示方式,而是如何将其传输到套接字,因此您可能不需要担心记录表示子句。

相反,您可以定义自己的Write常规:

procedure Write (Stream : not null access Ada.Streams.Root_Stream_Type'Class;
                 Item   : in My_Record_T);
for My_Record_T'Write use Write;

或者,我相信这将在 Ada 2012 中起作用:

type My_Record_T is record
    ...
end record
with Write => Write;

procedure Write (Stream : not null access Ada.Streams.Root_Stream_Type'Class;
                 Item   : in My_Record_T);

然后身体会看起来像

procedure Write (Stream : not null access Ada.Streams.Root_Stream_Type'Class;
                 Item   : in My_Record_T) is
begin
    -- Write out the record components, EXCEPT Array_Length and The_Array.
    T1'Write (Stream, Item.F1);  -- F1 is a record field, T1 is its type
    T2'Write (Stream, Item.F2);  -- F2 is a record field, T2 is its type
    ...

    -- Now write the desired data 
    declare
        Data_To_Write : Array_Type_T (1 .. Item.Array_Length)
            renames Item.The_Array (1 .. Item.Array_Length);
                -- I'm assuming the lower bound is 1, but if not, adjust your code
                -- accordingly
    begin
        Array_Type_T'Write (Stream, Data_To_Write);
            -- Note: using 'Write will write just the data, without any bound 
            -- information, which is what you want.
    end;
end Write;

但是,如果需要包装其他组件,则这将不起作用。如果要向包含一个 3 位记录组件和一个 5 位记录组件的套接字写入一个字节。如果有必要的话,我认为内置的'Write属性会为你做到这一点;你可能需要自己动手,或者你可能会变得棘手并定义一个数组Stream_Elements并使用Address子句或方面来定义覆盖记录其余部分的数组。但我不会使用覆盖方法,除非我 100% 确定套接字另一端的读取器是使用完全相同类型定义的 Ada 程序。

注意:我没有测试过这个。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ada:用可变大小的数组打包记录 的相关文章

  • 将 numpy 数组传递给 C++

    我有一些用 Python 编写的代码 其输出是 numpy 数组 现在我想将该输出发送到C 代码 其中将执行大部分计算 我尝试过使用 cython 的public cdef 但我正在处理一些问题 我将感谢您的帮助 这是我的代码 pymodu
  • 在 T-SQL 中解析 JSON 数组

    在我们的 SQL Server 表中 我们有一个存储有字符串数组的 json 对象 我想以编程方式将该字符串拆分为几列 但是 我似乎无法让它发挥作用 或者即使有可能 是否可以在WITH子句中创建多个列 或者在select语句中创建多个列是更
  • STL 容器速度与数组

    我刚刚开始从事一个科学项目 其中速度非常重要 HPC 我目前正在设计数据结构 该项目的核心是双值 3D 网格 以求解偏微分方程 由于这里的速度可能比代码的简单性更重要 我想知道 STL 与通常的 C 风格数组相比如何执行 就我而言 因为它是
  • 将 2D 矢量转换为 2D 数组

    自从我上次访问数组以来已经有一段时间了 我最近一直在使用向量 我需要将 2D 向量转换回 2D 数组 因为我正在使用的库接受类型的参数double array该数组的访问器在哪里foo i j 例如 这是我的代码 double setupH
  • 将 C 数组作为 char* 函数参数传递

    我有一些使用以下变量声明维护的代码 char tmpry 40 它与此功能一起使用 char SomeFunction char tmpryP Do stuff 函数调用是 SomeFunction tmpry 0 我非常确定这与以下内容相
  • C:将 unsigned char 数组转换为signed int(反之亦然)

    我正在尝试将无符号字符数组缓冲区转换为有符号整数 反之亦然 下面是演示代码 int main int argv char argc int original 1054 unsigned int i 1054 unsigned char c
  • 使用无效数据调用函数 FieldValue.arrayUnion()。 FieldValue.serverTimestamp() 只能与 update() 和 set() 一起使用

    addDeposit account deposit let depositsDoc this db collection accounts doc account id collection deposits doc deposits r
  • PHP:将字符串分成 8 个块,我该怎么做?

    我基本上有二进制 假设它的长度是300 我如何将它分割 就像使用爆炸一样 成 8 位块 我查看了 chunk split 但它似乎只有一个 end 参数 而不是将其放入数组的选项 或者它可以插入数组吗 末尾 8 位数字可以低于 8 如果有人
  • 查找所有数组的长度多维数组,Java

    我想使用多维数组来存储数据网格 但是 我还没有找到一种简单的方法来查找长度2nd数组的一部分 例如 boolean array new boolean 3 5 System out println array length 只会输出3 是否
  • 如何在 Microsoft 报告中显示字节数组中的图像

    我使用报表文件和 ReportViewer 控件来显示在运行时从对象动态加载数据的报表 我需要显示一个以字节数组形式存储在对象中的图像 PictureBox 的值当前设置为 First Fields ImageData Value dtst
  • 3D 数组到 3D std::vector

    我在代码函数中用 3D std vector 替换了 3D 数组 它进入了无限循环 你能给我一个提示吗 我真的需要使用向量而不是数组 谢谢 我最初的代码是 arr is a 3D array of a sudoku table the 3
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 如何计算特定字符在字符串中出现的次数

    我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 确定数组的大小(如果传递给函数)

    如果将数组传递给另一个函数 未传递大小 是否可以确定数组的大小 数组的初始化类似于 int array XXX 我知道不可能执行 sizeof 因为它会返回指针的大小 我问的原因是因为我需要在传递数组的另一个函数内运行 for 循环 我尝试
  • 如何使用 CNContacts 快速获取手机号码?

    我有一些代码可以检索用户联系人中的所有电话号码 但只想过滤掉手机号码 目前 我只是通过将第一个数字为 或第二个数字为 7 的数字添加到数组中来实现此目的 如下所示 func findContacts gt CNContact let key
  • $0 和 $1 在 Swift 闭包中意味着什么?

    let sortedNumbers numbers sort 0 gt 1 print sortedNumbers 谁能解释一下什么 0 and 1在斯威夫特中意味着什么 另一个样本 array forEach actions append
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va

随机推荐

  • VS Code 自动格式化 Python 代码以使用 2 个选项卡

    由于某种原因 Visual Studio Code 看起来正在将我的代码格式化为使用 2 个选项卡 我已经改变了我的settings json使用 2 个空格作为制表符 我已通过按制表符按钮验证了这一点 并且它按预期使用了 2 个空格 然而
  • android 弹出菜单文本颜色(AppCompat)

    我需要更改 popuo 菜单的文本颜色 但我找不到任何方法来执行此操作 我可以更改 popomenu 的背景但不能更改文本 我以这种方式编辑 style xml
  • 批处理文件-选择选项-设置默认选项

    在下面的示例批处理文件中 我有几个选项供用户选择 另外 我想设置一个默认选项 例如 我希望用户能够点击 ENTER 然后从我的列表中选择默认选项 我选择的 假设选项 1 谢谢您的帮助 ECHO OFF selector set input
  • 按列名称索引拆分数据框

    这是先前问题的变体 df lt data frame matrix rnorm 9 9 ncol 9 names df lt c c 1 d 1 e 1 a p b p c p 1 o1 2 o1 3 o1 我想按下划线 后面的column
  • 逐字遍历句子

    如何逐字遍历任何给定的句子 java中有内置函数吗 我不知道如何开始 像这样的事情 String sentence Your sentence here String words sentence split s splits by whi
  • matplotlib savefig 性能,在循环内保存多个 png

    我希望找到一种方法来优化以下情况 我有一个使用 matplotlib 的 imshow 创建的大型等高线图 然后 我想使用此等高线图来创建大量 png 图像 其中通过更改 x 和 y 限制以及长宽比 每个图像都是等高线图像的一小部分 因此
  • 从操作写入输出流

    由于一些奇怪的原因 我想将 HTML 从控制器操作直接写入响应流 我理解MVC分离 但这是一个特例 可以直接写入吗HttpResponse溪流 在这种情况下 哪个IView控制器操作应该返回对象吗 我可以返回 空 吗 我使用了一个派生类Fi
  • 如何从javascript数组中获取唯一用户名的最后记录

    我有一个对象数组 例如 id 8 username peter weight 80 date 2019 10 14 id 1 username harry weight 80 date 2019 01 01 id 2 username ha
  • 用玩笑测试 Observables

    如何使用 Jest 测试 Observables 我有一个每秒触发一次的 Observable 我想在玩笑超时之前测试第一个事件是否正确触发 const myObservable timer 0 1000 Example here it s
  • Elasticsearch 日期范围交集

    我在弹性搜索中存储类似以下信息的信息 timeslot start at 2013 02 01 timeslot end at 2013 02 03 鉴于我有另一个日期范围 例如 从用户输入给出 我想搜索相交的时间范围 与此类似 确定两个日
  • Chrome 中的 jQuery 动画问题

    我使用 jQuery 1 3 2 和 jQuery 颜色插件为 jQuery 中的 a 元素设置动画 我同时对 颜色 和 背景颜色 属性进行动画处理 在 IE8 和 FF 中它运行得很好 Chrome 对鼠标悬停颜色进行动画处理 然后停止
  • 寻找简单的Java内存缓存[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个简单的Java内存缓存 它具有良好的并发性 因此LinkedHashMap不够好 并且可以
  • MySQL 存储浮点数

    我正在尝试保存这么长的浮点数 13 00386644742523 它基本上是 Lat 和 Lng 值 当我将它保存在数据库中时 它被存储为 13 0039 您应该明确使用精度并且类型应该是DECIMAL NOT FLOAT因为小数点后的每一
  • PyFPDF在指定大小时无法添加页面

    在 pyfpdf 文档上据说可以在添加页面时指定格式 fpdf add page orientation format same False 但在指定格式时它给了我一个错误 error pdf add page format 1000 10
  • UCS2 与 UTF。 UCS2编码无法显示哪些语言?

    UCS2 比 UTF 编码更容易在 Visual C 中使用 UCS2 编码不支持哪些语言 没有什么是你可能关心的 或者更重要的是 没有字体 UCS2 为您提供基本的多语言平面 您可以在 Unicode 网站上找到指定平面的概述 0 基本多
  • 替换 gtable 中 ggplot 的元素:标签和网格线

    我正在学习操纵ggplot对象与gtable 这是我问的一个相关问题 用 grid 和 gtable 拆解 ggplot https stackoverflow com questions 27750737 dismantling a gg
  • 从 javascript 访问 JSF 资源

    我想访问 JSF 资源 在WebPages resources img 来自 JavaScript 函数 例如 function hideSpinner arguments i poster img sppiner png 我努力了argu
  • 动态添加 TextView - Android

    如何动态添加 TextView 到此 注释掉的代码不起作用 public class myTextSwitcher extends Activity private TextView myText public myTextSwitcher
  • 为什么方法引用不跟踪这一点?

    我正在使用 Babel 来转译 ES2015 类 class Foo constructor foo this foo foo sayFoo console log this foo 如果我说这样的话 这个课程的效果就完全符合我的预期foo
  • Ada:用可变大小的数组打包记录

    我正在寻找创建一个打包记录 它可以容纳长度从 5 50 个元素不等的数组 是否可以以这样的方式来完成此操作 以便可以在不浪费空间的情况下打包记录 当我去创建记录时 我会知道数组中有多少元素 the range of the array ty