web-dev-qa-db-fra.com

tableau c ++ - expression doit avoir une valeur constante

Je reçois une erreur lorsque j'essaie de créer un tableau à partir des variables que j'ai déclarées.

int row = 8;
int col= 8;
int [row][col];

Pourquoi ai-je cette erreur:

expression doit avoir une valeur constante.

41
Nicholas Kong

Lors de la création d'un tableau comme celui-ci, sa taille doit être constante. Si vous voulez un tableau de taille dynamique, vous devez lui allouer de la mémoire et le libérer également avec delete lorsque vous avez terminé:

//allocate the array
int** arr = new int*[row];
for(int i = 0; i < row; i++)
    arr[i] = new int[col];

// use the array

//deallocate the array
for(int i = 0; i < row; i++)
    delete[] arr[i];
delete[] arr;

Si vous voulez une taille fixe, alors ils doivent être déclarés const:

const int row = 8;
const int col = 8;
int arr[row][col];

Également,

int [row][col];

ne fournit même pas un nom de variable.

47
Foggzie

La norme requiert que la longueur du tableau soit une valeur calculable au moment de la compilation afin que le compilateur puisse allouer suffisamment d'espace sur la pile. Dans votre cas, vous essayez de définir la longueur du tableau sur une valeur inconnue au moment de la compilation. Oui, je sais qu'il semble évident que cela devrait être connu du compilateur, mais ce n'est pas le cas ici. Le compilateur ne peut émettre aucune hypothèse sur le contenu des variables non constantes. Alors allez avec:

const int row = 8;
const int col= 8;
int a[row][col];

UPD: certains compilateurs vous permettront effectivement de retirer ceci. IIRC, g ++ a cette fonctionnalité. Cependant, ne l'utilisez jamais car votre code ne sera plus portable sur tous les compilateurs.

16
user500944

C++ n'autorise pas les valeurs non constantes pour la taille d'un tableau. C'est juste la façon dont il a été conçu.

C99 permet à la taille d'un tableau d'être une variable, mais je ne suis pas sûr que cela soit autorisé pour deux dimensions. Certains compilateurs C++ (gcc) autoriseront cela comme une extension, mais vous devrez peut-être activer une option du compilateur pour l'autoriser.

Et je l'ai presque manqué - vous devez déclarer un nom de variable, pas seulement les dimensions du tableau.

15
Mark Ransom

Vous pouvez utiliser #define comme solution alternative, qui n'introduit pas vector et malloc, et vous utilisez toujours la même syntaxe lors de la définition d'un tableau.

#define row 8
#define col 8

int main()
{
int array_name[row][col];
}
8
sjtupuzhao

Quand vous déclarez une variable comme ici

int a[10][10];

vous dites au compilateur C++ que vous souhaitez que 100 entiers consécutifs soient alloués dans la mémoire du programme lors de l'exécution. Le compilateur fournira alors à votre programme autant de mémoire disponible et tout ira bien pour le monde.

Si toutefois vous dites au compilateur

int x = 9001;
int y = 5;
int a[x][y];

le compilateur n'a aucun moyen de savoir combien de mémoire vous allez réellement avoir besoin au moment de l'exécution sans faire beaucoup d'analyses très complexes pour localiser chaque dernier endroit où les valeurs de x et y ont changé [le cas échéant]. Plutôt que de prendre en charge de tels tableaux de taille variable, C++ et C suggèrent fortement, voire carrément, d’exiger que vous utilisiez malloc () pour allouer manuellement l’espace souhaité.

TL; DR

int x = 5;
int y = 5;
int **a = malloc(x*sizeof(int*));
for(int i = 0; i < y; i++) {
    a[i] = malloc(sizeof(int*)*y);
}

a est maintenant un tableau 2D de taille 5x5 et se comportera de la même manière que int a [5] [5]. Comme vous avez alloué manuellement de la mémoire, C++ et C exigent que vous la supprimiez aussi à la main ...

for(int i = 0; i < x; i++) {
    free(a[i]); // delete the 2nd dimension array
}
free(a); // delete a itself
6
arrdem

vous pouvez également utiliser un vecteur de longueurs fixes et y accéder avec l'indexation, mais l'utilisation de l'espace est moins efficace que l'utilisation de pointeurs

int Lcs(string a, string b) 
{
    int x = a.size() + 1;
    int y = b.size() + 1;

    vector<vector<int>> L(x, vector<int>(y));

    for (int i = 1; i < x; i++)
    {
        for (int j = 1; j < y; j++)
        {
            L[i][j] = a[i - 1] == b[j - 1] ?
                L[i - 1][j - 1] + 1 :
                max(L[i - 1][j], L[i][j - 1]);
        }
    }

    return L[a.size()][b.size()];
}
0
BigChief