2

まったく初心者の質問で申し訳ありませんが、答えが見つかりません。私はグーグルで検索し、ここで検索し、C++ 配列のドキュメントといくつかの C++ 配列のチュートリアルを検索しました。
質問は簡単です。なぜ

#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
      short pixelarray[3][3] = {{1,1,1},{0,0,0},{-1,-1,-1}};
      ... //do stuff.  Imagine a loop here, and BIG array - I'm just simplifying it for StackOverflow
      pixelarray = {{1,0,-1},{1,0,-1},{1,0,-1}};

    return 0;
}

エラーになりますか?

1>arraytest.cpp(11): error C2059: syntax error : '{'

配列内に静的配列を配置するにはどうすればよいですか? 各項目を個別に設定できることはわかっていますが、もっと良い方法が必要です。

4

6 に答える 6

6

C++ の組み込み配列には問題があり、代入可能でないことでかなり柔軟性がなくなります。より良いスタイルの配列をエミュレートする C++11 コンテナーであるに固執しstd::arrayます。これにより、探しているものと多少似た構文が可能になります。

std::array<int, 3> arr{{1, 2, 3}};
std::array<int, 3>{{4, 5, 6}}.swap(arr);
//now arr is {4, 5, 6}

これが完全なサンプルです。トリックは、新しく構築された配列で初期化リストを使用し、それを自分のものと交換することです。次の C++ の更新では、二重中括弧も不要になると思います。これにより、使い慣れた構文により近いものになります。

于 2012-12-20T01:29:24.037 に答える
3

初期化子リストは、初期化のためだけに使用できます:)
変数を宣言するときのように:

short pixelarray[3][3] = {{1,1,1},{0,0,0},{-1,-1,-1}}; // this is ok

これを削除する必要があります:

pixelarray = {{1,0,-1},{1,0,-1},{1,0,-1}};

そして、新しい値を手動で割り当てます(つまりpixelarray[x][y] =、またはを使用memcpy(pixelarray, <some other array>, sizeof(pixelarray))

于 2012-12-20T01:23:31.113 に答える
2

個々の要素を手動で割り当てたくない場合は、次のようにすることができます。

short pixelarray2[3][3] = {{1,0,-1},{1,0,-1},{1,0,-1}};
memcpy(pixelarray, pixelarray2, sizeof(pixelarray));

@Nickが指摘しているように、初期化子リストは割り当て用ではありません。

于 2012-12-20T01:32:43.967 に答える
2

配列は割り当てられないので、簡単な答えは、あなたが求めていることを正確に行うことはできないということです。ほとんどの目的で十分に類似したことを行う最も直接的な方法は、おそらく、前の回答std::vectorで投稿したものの順序で、のラッパーとして機能する2D配列クラスです。

Cスタイルの配列を使用することを主張する場合、1つの可能性はポインターを使用することです。

int main() { 
    typedef short array[3];

    array pixelarray0[3] = {{1,1,1},{0,0,0},{-1,-1,-1}};
    array pixelarray1[3] = {{1,0,-1},{1,0,-1},{1,0,-1}};

    array *pixelarray = pixelarray0;

    // when needed:
    pixelarray = pixelarray1;
}
于 2012-12-20T01:35:10.040 に答える
2

この質問を C の文脈から考えると、さまざまな定数配列を使用して、次のようにコピーするだけmemcpyです。

typedef short TArray[3][3];
const TArray a1 = {{1,1,1},{0,0,0},{-1,-1,-1}};
const TArray a2 = {{1,0,-1},{1,0,-1},{1,0,-1}};

// ...    
TArray a;
memcpy( a, a2, sizeof(TArray));

または、C99 構造体のコピーを悪用することもできますが、構造体がパディングされて配列よりも大きくなったり、配置が異なる可能性があるため、これは危険なハックだと思います。

typedef struct {
    TArray arr;
} TDummyArray;

// ...
TArray a;
*(TDummyArray*)a = *(TDummyArray*)a2;
于 2012-12-20T01:40:02.383 に答える
0

配列を宣言すると、代入演算子を使用して配列のコンテンツ全体を再割り当てする方法はありません。

したがって、この後にコンテンツまたは配列を変更するには、次のようにします。

short pixelarray[3][3] = {{1,1,1},{0,0,0},{-1,-1,-1}};

配列をループして各値を手動で変更するか、std::memcpyのようなものを使用して新しい値をコピーする必要があります。

ただし、そもそも配列を使用するのではなく、std::arrayやstd::vectorなどの代わりにstdコレクションライブラリから何かを使用する必要があります。コレクションを使用できない本当に正当な理由がある場合にのみ、配列を使用してください。

于 2012-12-20T01:35:08.410 に答える