Comment résoudre l'erreur “expression doit être modifiable lvalue” en 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;
}
L'erreur dans cette phrase:
graph->matrix = ADJ_MATRIX;
Je suis novice en c++. s'il vous plaît dites-moi pourquoi ce problème et comment le résoudre?
Je veux attribuer ADJ_MATRIX de la matrice dans struct
.
- Un
const
qualificatif pourrait être suffisant si vous êtes sûr que vous ne modifiez pas la matrice. Sinon, utilisezmemcpy
. - Vous n'avez pas besoin
typedef struct { ... } identifier;
BS. Vous pouvez juste direstruct identifier { ... };
Vous devez vous connecter pour publier un commentaire.
Malheureusement (ou peut-être heureusement, qui sait...), vous ne pouvez pas affecter un tableau à un autre en C++.
Si vous souhaitez copier un tableau, vous aurez besoin de prendre copie de chacun de ses éléments dans un tableau un par un, ou utiliser le
memcpy()
fonction:ou
memcpy
les adresses ne seront pas mis à jour correctementComme on l'a dit, vous ne pouvez pas attribuer les tableaux en C++. Cela est dû au compilateur un meanie, car le compilateur ne peut. Il ne peut pas vous laisser faire ça...
... à moins de le tromper 😉
Le catch? Maintenant, le code a besoin de quelques petites choses:
Et l'accès à l'cellules, maintenant, nous devons utiliser
graph->matrix.data[1][2]
. Cet effet peut être atténué par la surchargeoperator[]
ouoperator()
poursquare_matrix
. Cependant, c'est maintenant terriblement proche de la nouvellestd::array
classe, ou le coup de pouce équivalentboost::array
, de sorte qu'il pourrait être judicieux d'envisager la place.Tableaux ne sont pas cessibles. Vous pouvez utiliser
memcpy
:Vous ne pouvez pas affecter un tableau à un autre tableau. Vous aurez besoin de copier les éléments de la source à la destination de l'indice par indice, ou de l'utilisation
memcpy
pour copier les données. Tableau d'affectation comme c'est pas permisVous essayez d'affecter votre adresse de la variable d'une constante de données,
essayez d'utiliser
sizeof(variable)
est mieux quesizeof(data_type)*num_elements
comme il est ---plus--- flexiblesVous ne pouvez pas utiliser un tableau dans les affectations. Vous pouvez utiliser les cycles ou
memcpy
au lieuou
L'erreur est générée, car
int matrix[VERTEX_NUM][VERTEX_NUM]
dans une structure de définition signifie que chaque structure aura une 2D tableau d'entiers de taille prédéfinie etmatrix
va être pointant vers son premier élément. Le truc, c'est quematrix
ne peut pas être attribué à un arbitraire adresse, parce que c'est un pointeur const c'est à dire sa valeur (l'adresse qu'il pointe vers) ne peut pas changer.Vous avez 2 options: vous pouvez utiliser le
memcpy
ou certains algorithmes de la stl pour copier leADJ_MATRIX
dans la matrice directement ou vous pouvez déclarermatrix
comme un pointeur et faire la mission, qui est actuellement produit une erreur.Ce dernier peut être fait de la manière suivante:
Ainsi, vous pouvez faire
graph->matrix = ADJ_MATRIX
, mais vous ne serez pas en mesure de modifier les différents éléments dematrix
en raison de constness. Cela signifie,graph->matrix[0][1] = 3;
n'est pas autorisée, alors que vous pouvez lire les éléments librement.