2
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++:复制数组

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

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

谢谢

4

6 回答 6

4

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

如果没有,请使用memcpy从您的三个数组之一复制到led_pattern

于 2012-07-17T21:00:28.980 回答
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];
于 2012-07-17T20:53:42.760 回答
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*您当前使用的任何数组。

于 2012-07-17T21:01:19.880 回答
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 个阵列,而不是使用带有 LED 图案的 3 个不同的阵列。

于 2012-07-17T20:57:58.600 回答
1

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

于 2012-07-17T20:54:28.397 回答
1

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

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

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

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

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

于 2012-07-17T20:58:26.063 回答