单线捷径,用于将列表重新分配给阵列

乔治·罗宾逊

如何for loops使用C ++ 17功能优雅地简化(或消除)下面的代码?

#pragma pack(push, 1)
        typedef struct ethernet_frame
        {
            unsigned char   dst[6]; 
            unsigned char   src[6]; 
            unsigned short  proto;
        } ethernet_frame, *ethernet_frame_ptr;
#pragma pack(pop)

        int i;
        ethernet_frame eFrame = { {00,00,00,00,00,00}, {42, 54, 33, 67, 14, 88}, 0x800 };
        ProcessFrame(&eFrame); //A library function expecting an address of an ethernet_frame with its strict bit layout

        i = 0;
        for (unsigned char c : { 36, 84, 23, 77, 35, 11 }) eFrame.dst[i++] = c;
        ProcessFrame(&eFrame);

        i = 0;
        for (unsigned char c : { 65, 23, 74, 82, 20, 94 }) eFrame.dst[i++] = c;
        ProcessFrame(&eFrame);

        i = 0;
        for (unsigned char c : { 47, 22, 86, 45, 33, 38 }) eFrame.dst[i++] = c;
        ProcessFrame(&eFrame);

        // etc...

eFrame.Dst = { 47, 22, 86, 45, 33, 38 }这样的重新分配会很整洁...但是它们是非法的:(

G.睡觉

如果您不能更改struct ethernet_frame为use std::array,那么仍然可以使用几个单行来复制数据,尽管不太安全。首先,使用好old memcpy()

#include <cstring>
...
memcpy(eFrame.dst, std::array<unsigned char, 6>{36, 84, 23, 77, 35, 11}.begin(), std::size(eFrame.dst));

或使用std::copy_n()

#include <algorithm>
...
std::copy_n(std::array<unsigned char, 6>{36, 84, 23, 77, 35, 11}.begin(), std::size(eFrame.dst), eFrame.dst);

使用Ranges TS,您可以避免必须指定要复制的数据大小:

#include <experimental/ranges/algorithm>
...
std::experimental::ranges::copy(std::array<unsigned char, 6>{36, 84, 23, 77, 35, 11}, eFrame.dst);

另外,如果没有一个衬里要使用多个对象,那么您当然可以总是自己编写一个函数,将问题变成一个衬里。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将字符串重新分配给数组中的一组值列表

javascript将值重新分配给创建的元素

将值重新分配给字典的pythonic方法

将功能重新分配给值

将分区空间从/ boot重新分配给/

重新分配给const reference

通过重新分配方法参数的变量,将值重新分配给方法内部的实例变量

将新的结构重新分配给变量时,golang是否分配新的内存?

将字符串分配给动态int数组时的重新分配问题

“无法分配给命名常量”(重新分配变量)

javascript无法将数据重新分配给map()中的数组

Linux是否允许将进程组ID重新分配给进程?

为什么将智能指针重新分配给自身会导致破坏?

将内存重新分配给字符串的问题

将Alphet中的字母重新分配给python中的更高字母?

将实例变量重新分配给本地方法变量

为什么将方法参数重新分配给局部变量?

将值重新分配给特定列,并使用pandas与其余列合并

如何将内存(例如添加行)重新分配给GSL矩阵?

将现有的远程仓库重新分配给我的本地仓库

将值重新分配给变量时的JavaScript性能

二郎 如何将值重新分配给字符串

将Google Map var重新分配给新的div

通过echo将变量重新分配给自己有什么目的?

Babel Transpiler正在将参数重新分配给_arguments

如何将值重新分配给地图内的结构(Golang)

将类实例变量引用重新分配给局部变量引用

如何根据以下内容将值重新分配给字典

如何将触摸板按钮重新分配给键盘?