C++ 将所有数组复制到不带向量C+的新数组中+;
我试着做上面的,我将循环idx,复制一个新的序列到led_模式,然后循环,回来,得到下一个 我在这里找到了一种使用向量传递整个数组的方法; 但是向量(我相信)在我使用的编译器(avr-gcc/c++)上不起作用 <>如何在C++中实现这个?我知道在python中,下面的方法是可行的,我可以将一个数组分配给另一个变量,它可以“克隆”它C++ 将所有数组复制到不带向量C+的新数组中+;,c++,avr,avr-gcc,C++,Avr,Avr Gcc,我试着做上面的,我将循环idx,复制一个新的序列到led_模式,然后循环,回来,得到下一个 我在这里找到了一种使用向量传递整个数组的方法; 但是向量(我相信)在我使用的编译器(avr-gcc/c++)上不起作用 如何在C++中实现这个?我知道在python中,下面的方法是可行的,我可以将一个数组分配给另一个变量,它可以“克隆”它 谢谢替换这行不符合您要求的内容: int led_p1[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0
谢谢替换这行不符合您要求的内容:
int led_p1[8] = {0x01, 0x02, 0x04, 0x08,
0x10, 0x20, 0x40, 0x80};
int led_p2[8] = {0x81, 0x42, 0x24, 0x18,
0x18, 0x24, 0x42, 0x81};
int led_p3[8] = {0xFF, 0x00, 0xFF, 0x00,
0xFF, 0x00, 0xFF, 0x00};
int led_pattern[8] = {};
int pattern_idx = 0;
// select pattern for now
switch(pattern_idx)
{
case 0:
led_pattern = led_p1;
pattern_idx++;
break;
case 1:
led_pattern = led_p2;
pattern_idx++;
break;
case 2:
led_pattern = led_p3;
pattern_idx = 0;
break;
}
其中任何一个都会,按偏好降序排列
led_pattern = led_p1;
std::复制(led_p1,led_p1+8,led_图案);
memcpy(led_图案、led_p1、led_p1尺寸);
对于(int i=0;i<8;i++)led_图案[i]=led_p1[i];
要进行深度复制,必须将第一个数组中的每个值复制到新数组中。不只是将旧指针分配给新指针,而是对数组中的元素数执行for循环,并将每个元素分配给新副本。通常的方法是使用std::copy()。复制使用两个迭代器(表示要复制的序列的开始和结束)和第三个参数作为目标:
std::copy(led_p1, led_p1 + 8, led_pattern);
memcpy(led_pattern, led_p1, sizeof led_p1);
for(int i = 0; i < 8; i++) led_pattern[i] = led_p1[i];
如果表达式sizeof(led_p1)/sizeof(led_p1[0])的计算结果为8,则表示数组中的元素数。您可以使用一个包含3个阵列的阵列,并在这3个阵列上进行迭代,而不是在LED阵列上使用3个不同的阵列。要在内存级别制作硬拷贝,您可能需要使用旧的C函数:
memcpy
std::copy( &led_p1[ 0 ], &led_p1[ sizeof(led_p1) / sizeof(led_p1[ 0 ]) ], &led_pattern[ 0 ])
8
如果数组大小不同,则应替换为数组大小
功能说明:
www.cplusplus.com/reference/clibrary/cstring/memcpy/
#include
也应该使用。(按照Prætorian所说的编辑)您真的需要复制到led_模式中吗?你打算更改内容吗?如果它本质上是常量,为什么不将led\u模式
声明为指向int的指针?这将更有效率,因为您只需指向三个现有阵列中的一个,而不是复制它们
如果没有,请使用memcpy
从三个阵列中的一个复制到led\u模式中
如果我正确读取OP,您不需要深度复制,但需要切换用于led的阵列。因此,您可以制作一个指针,在数组之间切换,如下所示:
memcpy (led_pattern,led_p1, 8 * sizeof(int));
因此,现在您可以切换led\u模式
指向当前使用的led\u p*
阵列。我不明白;为什么不能执行led\u模式[0]=led\u p1[0]
。。等等?或者更好的是,使用具有适当的现成复制语义的。或者更好的是,如果编译器支持,则使用std::array
。尽管,如果“向量在我使用的编译器上不起作用”,很难知道什么会起作用。向量不起作用可能是因为禁用了异常;如果是这样的话,array
应该还可以。@texasbruce-S“好的,会出错的。”。我希望我的话听起来不要太刺耳。但是,您应该知道,您将得到。如果您#include
,您应该将函数调用限定为std::memcpy
。要将其称为memcpy
,请改为包含
。或者最好的是,因为问题是用C++标记的,使用<代码> STD::复制< /COD>。FI:如果你有C++ 11可用,前两个ARG可以是<代码> STD::开始(LeDyP1),STD::结束(LeDyP1)< /代码> @ @ Robᵩ 即使最后,如果您没有可用的C++11,一千个函数是如此方便,以至于我将它们放在我所从事的每个项目的每个工具箱中;-)每个都只是一行。我想我可以和其他人一起尝试,老实说,是的,我只想使用而不是修改值。感谢+1识别X,而不是解决Y,in。对XY问题的阅读很棒,从未听说过。你每天都能学到新东西!(在我的情况下可能有两件事!)谢谢大家。+1感谢你们发现OP的潜在问题,而不是(仅仅)回答他的问题。
int led_p1[8] = {0x01, 0x02, 0x04, 0x08,
0x10, 0x20, 0x40, 0x80};
int led_p2[8] = {0x81, 0x42, 0x24, 0x18,
0x18, 0x24, 0x42, 0x81};
int led_p3[8] = {0xFF, 0x00, 0xFF, 0x00,
0xFF, 0x00, 0xFF, 0x00};
int *led_pattern = led_p1; //Starting point
int pattern_idx = 0;
// select pattern for now
switch(pattern_idx)
{
case 0:
led_pattern = led_p1;
pattern_idx++;
break;
case 1:
led_pattern = led_p2;
pattern_idx++;
break;
case 2:
led_pattern = led_p3;
pattern_idx = 0;
break;
}