如何在c ++中解决错误“表达式必须是可修改的左值”?

时间:2012-08-07 09:52:03

标签: c++ visual-c++

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中的矩阵。

7 个答案:

答案 0 :(得分: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()square_matrix来减轻这种情况。但是,这现在非常接近新std::array类或Boost等效boost::array,因此考虑这些可能是明智之举。

答案 1 :(得分:6)

不幸的是(或者幸运的是,谁知道......)你不能只用C ++将一个数组分配给另一个数组。

如果要复制数组,则需要将每个元素逐个复制到新数组中,或使用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) );

答案 2 :(得分:3)

数组不可分配。您可以使用memcpy

memcpy(graph->matrix, ADJ_MATRIX, sizeof(graph->matrix));

答案 3 :(得分:1)

您正在尝试分配常量数据的变量地址, 尝试使用

memcpy(graph->matrix,ADJ_MATRIX,sizeof(ADJ_MATRIX));//using sizeof(graph->matrix) is safer.

答案 4 :(得分:1)

您无法将数组分配给另一个数组。您需要通过索引将元素从源复制到目标索引,或使用memcpy复制数据。不允许这样的数组赋值

答案 5 :(得分: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];
    }
}

答案 6 :(得分:0)

抛出错误,因为结构定义中的int matrix[VERTEX_NUM][VERTEX_NUM]意味着每个结构将具有预定义大小的整数的2D数组,并且matrix将指向其第一个元素。问题是matrix不能分配给任意地址,因为它是一个const指针,即它的值(它指向的地址)不能改变。

这里有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;是不允许的,而您可以自由阅读这些元素。