1
const int ADJ_MATRIX[VERTEX_NUM][VERTEX_NUM]={   
                                                {0,1,1,0,0,0,0,0},
                                                {1,0,0,1,1,0,0,0},
                                                {1,0,0,0,0,1,1,0},
                                                {0,1,0,0,0,0,0,1},
                                                {0,1,0,0,0,0,0,1},
                                                {0,0,1,0,0,0,1,0},
                                                {0,0,1,0,0,1,0,0},
                                                {0,0,0,1,1,0,0,0}
                                            };

typedef struct {
    int vertex;
    int matrix[VERTEX_NUM][VERTEX_NUM];
    int vNum;
    int eNum;
}Graph;

void buildGraph(Graph *graph){
    graph->vNum = VERTEX_NUM;
    graph->eNum = EDGE_NUM;
    graph->matrix = ADJ_MATRIX;
}

次の文でエラーが発生します。

graph->matrix = ADJ_MATRIX;

私はC++を初めて使用します。この問題が発生する理由とその解決方法を教えてください。

ADJ_MATRIXをの行列に割り当てたいstruct

4

7 に答える 7

8

すでに述べたように、C++では配列を割り当てることはできません。これは、コンパイラーができるので、コンパイラーが意味のあるものであるためです。それはあなたにそれをさせません...

...あなたがそれをだまさない限り;)

template <typename T, int N>
struct square_matrix {
    T data[N][N];
};

square_matrix<int, 10> a;
square_matrix<int, 10> b;
a = b; // fine, and actually assigns the .data arrays
a.data = b.data; // not allowed, compiler won't let you assign arrays

キャッチ?ここで、コードにはいくつかの小さなことが必要です。

const square_matrix<int, VERTEX_NUM> ADJ_MATRIX={{ 
                                               // blah blah
                                            }}; // extra set of braces

typedef struct {
    int vertex;
    square_matrix<int, VERTEX_NUM> matrix;
    int vNum;
    int eNum;
}Graph;

void buildGraph(Graph *graph){
    graph->vNum = VERTEX_NUM;
    graph->eNum = EDGE_NUM;
    graph->matrix = ADJ_MATRIX; // no change
}

そして、セルにアクセスするには、を使用する必要がありますgraph->matrix.data[1][2]operator[]これは、オーバーロードまたはoperator()forによって軽減できますsquare_matrixstd::arrayただし、これは現在、新しいクラス、または同等のBoostに非常に近づいているboost::arrayため、代わりにそれらを検討するのが賢明かもしれません。

于 2012-08-07T10:05:21.990 に答える
6

残念ながら(または幸いなことに、誰が知っているか...)、C++で1つの配列を別の配列に割り当てることはできません。

配列をコピーする場合は、その各要素を1つずつ新しい配列にコピーするか、次のmemcpy()関数を使用する必要があります。

for( int i = 0; i < VERTEX_NUM; i++ )
    for( int j = 0; j < VERTEX_NUM; j++ )  
       graph->matrix[i][j] = ADJ_MATRIX[i][j];

また

memcpy( graph->matrix, ADJ_MATRIX, VERTEX_NUM * VERTEX_NUM * sizeof(int) );
于 2012-08-07T09:57:18.840 に答える
3

配列は割り当てできません。あなたが使用することができますmemcpy

memcpy(graph->matrix, ADJ_MATRIX, sizeof(graph->matrix));
于 2012-08-07T09:56:30.183 に答える
1

定数データの変数アドレスを割り当てようとしている場合は、次を使用してみてください

memcpy(graph->matrix,ADJ_MATRIX,sizeof(ADJ_MATRIX));//using sizeof(graph->matrix) is safer.
于 2012-08-07T09:56:19.090 に答える
1

アレイを別のアレイに割り当てることはできません。インデックスごとにソースから宛先インデックスに要素をコピーするか、を使用memcpyしてデータをコピーする必要があります。このような配列の割り当ては許可されていません

于 2012-08-07T09:58:27.810 に答える
0

割り当てで配列を使用することはできません。サイクルを使用するか、memcpy代わりに使用できます

memcpy(graph->matrix, ADJ_MATRIX, VERTEX_NUM * VERTEX_NUM * sizeof(int));

また

for(int i = 0; i < VERTEX_NUM; ++i){
    for(int j = 0; j < VERTEX_NUM; ++j){
        graph->matrix[i][j] = ADJ_MATRIX[i][j];
    }
}
于 2012-08-07T09:56:33.037 に答える
0

エラーがスローされます。これint matrix[VERTEX_NUM][VERTEX_NUM]は、構造体の定義では、各構造体が事前定義されたサイズの整数の2D配列を持ち、matrix最初の要素を指していることを意味するためです。これはmatrixconstポインタであるため、任意のアドレスに割り当てることはできません。つまり、その値(ポイントしているアドレス)は変更できません。

ここには2つのオプションがあります。memcpyまたはいくつかのstlアルゴリズムを使用して、ADJ_MATRIXをマトリックスに直接コピーするかmatrix、ポインターとして宣言して、現在エラーが発生している割り当てを行うことができます。

後者は次の方法で実行できます。

typedef struct {
    int vertex;
    const int (*matrix)[VERTEX_NUM];
    int vNum;
    int eNum;
}Graph;

したがってgraph->matrix = ADJ_MATRIX、割り当てを行うことはできますが、恒常性のために個々のアイテムを変更することはできませんmatrix。これは、graph->matrix[0][1] = 3;要素を自由に読み取ることができる間は許可されないことを意味します。

于 2012-08-07T10:00:28.870 に答える