按变量名迭代结构体

2024-02-20

更新:6个月后,我刚刚发现了这个答案:索引结构是否合法?:Slava 的回答 https://stackoverflow.com/a/40590471/2066079。我认为这是一个比这里提供的任何解决方案都要好得多的解决方案,因为绝对没有未定义的行为。希望这对下一个人有帮助,因为对我来说实施已经太晚了。


在您评论告诉我使用数组或向量或任何形式的容器之前,我不能,这是一个残酷的事实。我知道,这可以通过数组来解决,否则任何解决方案都是相当“hacky”的。我很想使用容器,但我绝对不能。

我是一家非常大的公司的中级开发人员,我们正在使用公司范围的库通过以太网发送数据。有多种原因导致它不支持数组/向量,而是使用 POD(普通旧数据 - 字符、浮点数、整数、布尔值)结构。我从一个浮点数数组开始,必须使用它来填充具有相同数量浮点数的结构。由于该库的目的是通过以太网发送消息,因此我只需要进行两次迭代 - 一次在发送,一次在接收。在所有其他情况下,该数据都存储为数组。我知道 - 我应该序列化数组并按原样发送它们,但我再说一遍 - 我绝对不能。

我有一个float[1024],并且必须迭代数组并填充以下结构:

struct pseudovector
{
    float data1;
    float data2;
    float data3;
    ...
    float data1024;
}

我已经生成了这个结构BOOST_PP_REPEAT https://stackoverflow.com/questions/18441431/boost-pp-repeat-with-array and BOOST_PP_SEQ_FOR_EACH_I https://stackoverflow.com/questions/18483572/how-can-i-use-a-macro-for-collecting-variable-names/18483867#18483867这样我就不必写出所有 1024 个浮点数,并且它提高了可维护性/可扩展性。

以同样的方式,我尝试通过预编译器迭代结构##连接(https://stackoverflow.com/a/29020943/2066079 https://stackoverflow.com/a/29020943/2066079),但由于这是在预编译时完成的,因此它不能用于运行时获取/设置。

我已经考虑过实施反射,例如如何向 C++ 应用程序添加反射? https://stackoverflow.com/questions/41453/how-can-i-add-reflection-to-a-c-application and 思考图书馆 https://github.com/billyquith/ponder,但这两种方法都要求您明确写出可以反映的每个项目。在这种情况下,我不妨创建一个std::map<string, float>并通过字符串/整数连接在 for 循环中迭代:

for(i=0;i<1024;i++)
{
    array[i] = map.get(std::string("data")+(i+1))
}

谁能推荐一个更干净的解决方案,不需要我编写超过 1024 行代码?感谢您的帮助!

再次,我重复一遍 - 我绝对不能使用任何类型的数组/向量。


这可能比您预期的要容易。首先,一些注意事项:

  1. 标准保证数组是连续的;也就是说,它们之间没有插入填充,并且数组本身符合元素类型的对齐要求。

  2. 结构体没有这样的限制;它们可以进行任意填充。然而,给定的实现(在给定的版本)将在所有翻译单元中以相同的方式执行此操作(否则,如何使用相同的结构定义跨翻译单元传递数据?)。完成此操作的通常方法是相当明智的,特别是当结构包含only单一类型的成员。对于这样的结构体,对齐usually匹配成员的最大对齐,并且有usually没有填充,因为所有成员都具有相同的对齐方式。

在你的例子中,你的数组有 1024 个浮点数,你的结构有 1024 个浮点数成员几乎可以确定具有完全相同的内存布局。这是绝对没有标准保证,但是您的编译器可能会记录其结构布局规则,并且您始终可以断言单元测试中的大小和对齐方式匹配(您确实有单元测试,对吧?)

考虑到这些注意事项,您将几乎可以确定能够简单地reinterpret_cast (or memcpy) 两者之间。

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

按变量名迭代结构体 的相关文章

  • 具有不同大小结构的结构数组的 malloc()

    如果每个结构都包含一个大小不同的字符串数组 那么如何正确地 malloc 一个结构数组 因此每个结构可能有不同的大小 并且不可能 realloc 结构体数量 sizeof 结构体名称 after malloc 初始大小 sizeof 结构名
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • SSL/TLS/HTTPS 站点在 C#/.NET WebBrowser 控件中非常慢,但在 Internet Explorer 中则很好

    背景 我正在修改自动维基浏览器 http en wikipedia org wiki Wikipedia AutoWikiBrowser使用托管在安全服务器上的 MediaWiki 站点 我允许用户通过 C 应用程序中的 WebBrowse
  • 在 C++ 中将成对向量转换为两个独立向量的最快方法

    假设我有一个vector of pair
  • C++中delete和delete[]的区别[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的删除与删除 运算符 https stackoverflow com questions 2425728 delete vs delete operators in c 我写了一个包含两个指针的
  • 在 C# Winforms 应用程序中嵌入 Windows XP 主题

    我有一个旧版 C Windows 窗体应用程序 其布局是根据 Windows XP 默认主题设计的 由于需要将其作为 Citrix 应用程序进行分发 该应用程序现在看起来像经典主题应用程序 因为 Citrix 不鼓励使用主题系统服务 所以
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 使用 HTMLAgilityPack 从节点的子节点中选择所有

    我有以下代码用于获取 html 页面 将网址设置为绝对 然后将链接设置为 rel nofollow 并在新窗口 选项卡中打开 我的问题是关于将属性添加到 a s string url http www mysite com string s
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 带有私有设置器的 EFCore Base 实体模型属性 - 迁移奇怪的行为

    实体模型继承的类内的私有设置器似乎会导致 EFCore 迁移出现奇怪的问题 考虑以下示例 其中有多个类 Bar and Baz 继承自Foo 跑步时Add Migration多次命令 添加 删除private修饰符 生成的模式在多个方面都是
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • Android - 使用意图从手机内存中打开文件

    我正在开发一个应用程序 它将手机中的 txt 文件作为输入并将其打印在 TextView 上 public class MainActivity extends AppCompatActivity Button button Intent
  • Android中位图压缩后如何保存Exif数据

    我需要从 SD 卡获取图像 创建 旋转并保存更改后的图像 我尝试使用这段代码 Bitmap original BitmapFactory decodeFile file getAbsolutePath ExifInterface origi
  • 如何在具有融化数据的 ggplot 中缩放密度图(对于多个变量)

    我有一个融化的数据集 其中还包括从正态分布生成的数据 我想根据正态分布绘制数据的经验密度函数 但生成的两个密度图的比例不同 我可以找到两个单独数据集的这篇文章 标准化 ggplot 中叠加密度图的 x 尺度 https stackoverf
  • 如何让活动指示器等待函数

    我想使用活动指示器来显示我的函数正在加载 它运行得如此之快 我可以看到我的活动指示器 但该功能尚未完成加载 问题 当函数真正完成运行时 如何使用使我的活动指示器为 false 这是我的代码 public MainPage Initializ
  • 如何清除Docker任务历史记录

    当以 Swarm 模式运行 docker 时 过去任务的历史记录会随着 docker 服务的更新而累积 跑步docker node ps显示任务日志 如何在不删除服务的情况下清除此日志 您可以通过运行以下命令来调整 swarm 中的历史记录
  • IE9拒绝加载自定义字体?

    我正在尝试让 IE9 显示自定义字体 应该很容易 研究了大量的谷歌网站 甚至 stackoverflow 问题 这就是我所拥有的 font face font family BrushstrokePlain src url fonts BR
  • 了解 git rev-list

    在寻找 git hook 示例时 我遇到了以下帖子 https github com Movidone git hooks blob master pre receive https github com Movidone git hook
  • Stackdriver 监控图表的算术运算

    我正在尝试为我的服务提供的自定义指标设置 Stackdriver 仪表板 特别是我从一般开始custom grpc time ms指标是一个量规并且有status上面有标签 我希望能够设置一个图表并针对指标的成功率发出警报 类似于count
  • Azure AppInsights - Http 结果代码故障

    我们已经在Azure中配置了API WebApp 然后连接了App Insights Log以获取失败时的详细信息 我们正在 APIM 上进行负载测试 有一次 我们开始收到 500 错误代码 这意味着应用程序级别存在问题 当我们查看详细信息
  • 何时使用 C++forward_list

    我对 C 有点陌生 正在阅读 C 编程语言 第 4 版 一书 在阅读 STL Containers 章节时 书中对forward list有介绍 forward list 单链表 基本上是一个优化的列表 对于空的和非常短的列表 空的forw
  • 优化整数系数列表与其长整数表示之间的转换

    我正在尝试优化我的多项式实现 特别是我正在处理系数模的多项式n 可能 gt 2 64 并对以下形式的多项式取模x r 1 r is lt 2 64 目前 我将系数表示为整数列表 并且我已经以最直接的方式实现了所有基本操作 我希望求幂和乘法尽
  • Chrome 扩展程序 MAX_WRITE 配额未补充

    我最近超出了 chrome 扩展中每小时允许的写入操作数 现在当我尝试使用 chrome storage 时收到此消息 Unchecked runtime lastError while running storage set This r
  • Spring Security JavaConfig:配置所需的通道(安全、不安全、任意)

    我试图通过任何渠道提供所有静态资源 css javascript 和图像 但无法让它与 anyRequest requiresInsecure Configuration EnableWebMvcSecurity PropertySourc
  • 通过滚动查找所有元素

    查找页面上所有具有滚动的元素的最可靠和最有效的方法是什么 目前 我正在考虑使用element all http angular github io protractor api view ElementArrayFinder with fi
  • 组合框在所选项目上绘制图像

    当选择该项目时 我尝试从组合框中的图像列表中绘制图像 我能够绘制图像 但是当onSelctedIndexChanged活动结束 我失去了我的形象 我的组合框已经有DrawMode OwnerDrawFixed 我有一个ListImage名为
  • 管理员权限被意外删除

    在尝试清除 Sonar 实例中不需要的用户 权限时 管理员的权限似乎已被撤回 我们再也看不到settings菜单项 通常出现在管理员登录链接旁边 无法再更改警报 我现在花了几个小时试图找出这些权限在数据库中的位置 并希望使用数据库中的一些插
  • 主干推送状态和错误 404

    我正在尝试实施 pushState true 但它仅适用于基本路线 不适用于其他继续给我错误 404 的路线 在 Chrome 中 如果我访问 http example app http example app OK 控制台消息显示 htt
  • 在 Elixir 中将映射转换为关键字列表

    我有一张以下形式的地图 browser name gt Chrome platform gt linux 我需要将其转换为关键字列表 browser name Chrome platform linux 实现这一目标的最佳方法是什么 这行不
  • 在这里疯了,不明白为什么 rename()、copy() 函数不起作用

    这是我所拥有的 name image jpeg to var www vhosts site com httpdocs termination files personal photos original name from var www
  • 按变量名迭代结构体

    更新 6个月后 我刚刚发现了这个答案 索引结构是否合法 Slava 的回答 https stackoverflow com a 40590471 2066079 我认为这是一个比这里提供的任何解决方案都要好得多的解决方案 因为绝对没有未定义