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へのポインタとして宣言しませんか?コピーするのではなく、既存の3つの配列の1つを指すだけなので、これははるかに効率的です。

そうでない場合は、を使用memcpyして3つのアレイの1つからにコピーします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は、コピーするシーケンスの開始と終了を示す2つのイテレータと、宛先として3番目のパラメータを取ります。

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と評価される場合、配列内の要素の数。LEDパターンで3つの異なるアレイを使用する代わりに、3つのアレイでアレイを使用し、この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 に答える