Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将所有数组复制到不带向量C+的新数组中+;_C++_Avr_Avr Gcc - Fatal编程技术网

C++ 将所有数组复制到不带向量C+的新数组中+;

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

我试着做上面的,我将循环idx,复制一个新的序列到led_模式,然后循环,回来,得到下一个

我在这里找到了一种使用向量传递整个数组的方法;

但是向量(我相信)在我使用的编译器(avr-gcc/c++)上不起作用

<>如何在C++中实现这个?我知道在python中,下面的方法是可行的,我可以将一个数组分配给另一个变量,它可以“克隆”它


谢谢

替换这行不符合您要求的内容:

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;
}