将所有数组复制到没有向量C ++的新数组中

时间:2012-07-17 20:51:08

标签: c++ avr avr-gcc

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

我尝试了上面的操作,我将循环idx,将一个新序列复制到led_pa​​ttern,然后循环,返回,获取下一个。

我在这里找到了一个使用向量传递整个数组的方法; C++: copy array

但是矢量(我相信)不适用于我正在使用的编译器(avr-gcc / c ++)

如何在C ++中实现这一点?我知道在python中下面会工作,我可以将一个数组分配给另一个变量,并“克隆”它。

由于

6 个答案:

答案 0 :(得分:4)

你真的需要复制到led_pattern吗?你要改变内容吗?如果它本质上是const,为什么不将led_pattern声明为指向int的指针?这样会更有效率,因为你只是指向三个现有数组中的一个而不是复制它们。

如果没有,请使用memcpy从三个阵列中的一个复制到led_pattern

答案 1 :(得分:3)

替换不符合您要求的行:

led_pattern = led_p1;

根据偏好的降序排列任何一个。

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

答案 2 :(得分:3)

如果我正确读取OP,您不需要深层复制,但想要切换用于LED的阵列。所以你会创建一个可以在数组之间切换的指针,如下所示:

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

现在,您可以切换led_pattern以指向您当前使用的led_p*数组。

答案 3 :(得分:2)

通常的方法是使用std :: copy()。 std :: copy需要两个迭代器来表示要复制的序列的开始和结束,第三个参数作为目标:

std::copy( &led_p1[ 0 ], &led_p1[ sizeof(led_p1) / sizeof(led_p1[ 0 ]) ], &led_pattern[ 0 ])

表达式sizeof(led_p1)/ sizeof(led_p1 [0])的计算结果为8,即数组中的元素数。您可以使用包含3个数组的数组并迭代这3个数组,而不是使用3个不同的数组和LED模式。

答案 4 :(得分:1)

要进行深层复制,必须将第一个数组中的每个值复制到新数组中。不要只是将旧指针指定给新指针,而是对数组中元素的数量进行for循环,并将每个指针分配给新副本。

答案 5 :(得分:1)

要在内存级别制作硬拷贝,您可能需要使用旧的C函数:memcpy

memcpy (led_pattern,led_p1, 8 * sizeof(int));

8如果不同,则应替换为数组大小。

功能说明: www.cplusplus.com/reference/clibrary/cstring/memcpy /

#include <string.h>也应该被使用。(编辑为Prætorian说)