Pourquoi est-ce que je reçois l'erreur «L'objet de taille variable ne peut pas être initialisé» avec le code suivant?
int boardAux[length][length] = {{0}};
c
compiler-errors
initializer-list
variable-length-array
Bonjour le monde
la source
la source
enum {length = 0xF } ; int boardAux[length][length] = {0};
Réponses:
Je suppose que vous utilisez un compilateur C99 (avec prise en charge des tableaux de taille dynamique). Le problème dans votre code est qu'au moment où les compilateurs voient votre déclaration de variable, ils ne peuvent pas savoir combien d'éléments il y a dans le tableau (je suppose également ici, à partir de l'erreur du compilateur, que ce
length
n'est pas une constante de temps de compilation).Vous devez initialiser manuellement cette baie:
la source
printf( "%d", boardAux[1][2] )
compile correctement . Le compilateur connaît les tailles et sait à quelle position en mémoire se trouve le (1,2) -ème élément. Si vous utilisez l'allocation dynamique, le tableau est unidimensionnel et vous devez effectuer le calcul vous-même:printf("%d", boardAux[ 1*length + 2 ])
memset
appel. Je viens de le corriger.length
comme étantstatic
? En C ++ 14, cela fonctionne très bien.Vous recevez cette erreur car en langage C, vous n'êtes pas autorisé à utiliser des initialiseurs avec des tableaux de longueur variable. Le message d'erreur que vous recevez dit tout.
la source
Cela donne une erreur:
Cela donne également une erreur:
Mais cela fonctionne bien:
Vous devez mettre de la valeur de la manière suivante:
la source
Après avoir déclaré le tableau
la façon la plus simple d'affecter les valeurs initiales comme zéro est d'utiliser la boucle for, même si elle peut être un peu longue
la source
memset
est plus simple et plus rapide.La question est déjà répondue mais je voulais souligner une autre solution qui est rapide et fonctionne si la longueur n'est pas censée être modifiée au moment de l'exécution. Utilisez la macro #define avant main () pour définir la longueur et dans main () votre initialisation fonctionnera:
Les macros sont exécutées avant la compilation réelle et la longueur sera une constante au moment de la compilation (comme indiqué par David Rodríguez dans sa réponse). Il remplacera en fait la longueur par 10 avant la compilation.
la source
Déclarez simplement la longueur comme étant un inconvénient, si ce n'est pas le cas, vous devriez allouer de la mémoire dynamiquement
la source
const int lenght=5; int array[length][length] = {{0}};
pas.la source
Pour une déclaration et une initialisation séparées en C ++ comme ceci.
la source
Tu ne peux pas le faire. Le compilateur C ne peut pas faire une chose aussi complexe sur la pile.
Vous devez utiliser le tas et l'allocation dynamique.
Ce que vous devez vraiment faire:
Utilisez * access (boardAux, x, y, size) = 42 pour interagir avec la matrice.
la source