J'essaye de créer une matrice zéro MxN
en utilisant un tableau en C ++
. Mais certaines valeurs ne sont pas nulles. Aidez-moi à résoudre ce problème.
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
input: 4 4
output:
XXX
sortie attendue:
0 11097 1757549776 11097 0 0 0 0 0 0 0 0 0 0 0 0
6 Réponses :
Je ne suis pas sûr, mais c'est probablement parce que la taille de la matrice est dynamique et que le compilateur ne peut pas générer d'initialiseur au moment de la compilation.
s [m] [n] = {0}
l'initialisation n'est valide que lorsque vous connaissez la taille de la matrice au moment de la compilation, vous devez utiliser memset ou une boucle pour initialiser cette matrice. utiliser memset est très simple: memset(s,0,m*m*sizeof(int))
La question est étiquetée C ++, pas C. Les VLA n'existent pas en C ++, et vous utiliseriez std :: fill
.
Ce code n'est pas valide en C ++ standard car il ne permet pas la création de tableaux dynamiques sans new
comme celui-ci.
Par exemple, voici la sortie VC ++: https://rextester.com/VFVL26633
ource_file.cpp(9): note: failure was caused by non-constant arguments or reference to a non-constant symbol source_file.cpp(9): note: see usage of 'm' source_file.cpp(14): warning C4552: '<<': operator has no effect; expected operator with side-effect source_file.cpp(18): error C2036: 'int [m][n]': unknown size
Si vous faites n
, m
const cela fonctionnera correctement.
Utilisez std: : vecteur
ou new
/delete
.
Plusieurs compilateurs prennent en charge les VLA en tant qu'extension non standard.
@Peter: C'est vrai, mais cela signifie que vous ne pouvez pas compter sur eux pour implémenter la même extension non standard. Par exemple, ce problème exact (zéro initialisation) peut être incohérent entre les compilateurs.
@MSalters - Aucun argument à ce sujet. Le contexte de mon commentaire précédent était la publication originale de cette réponse, qui utilisait un langage plus provisoire qu'aujourd'hui. (Il semble que la réponse a été modifiée dans sa forme actuelle environ une heure avant votre commentaire).
L'attribution d'une taille de matrice / tableau statique sous forme de variable est interdite. Vous devez indiquer la taille lors de la compilation ou utiliser des tableaux dynamiques.
#include <iostream> using namespace std; int main() { int i, j, s[4][4] = { 0 }; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { cout << s[i][j] << " "; } cout << endl; } }
Lorsque vous déclarez un tableau s
, ses dimensions doivent être connues au moment de la compilation.
Comme vous n'avez pas initialisé explicitement m
et n
, ils sont tous deux initialisés avec des valeurs aléatoires et utilisés pour la déclaration du tableau s
.
Ainsi, votre tableau s
peut avoir des dimensions aléatoires (peut-être zéro) et après avoir entré m
et n
à partir de cin
vous est peut-être juste en train d'imprimer des cellules mémoire non initialisées.
Vous voudrez peut-être revérifier le code. Les valeurs de m
et n
sont lues à partir de l'entrée standard. Quoi qu'il en soit, même si ce n'était pas le cas, ils ne seraient pas "initialisés avec des valeurs aléatoires" (comportement non spécifié), ils seraient non initialisés (comportement non défini).
Les m
et n
sont effectivement lus à partir de l'entrée standard, mais pour la déclaration du tableau au moment de la compilation, ils n'ont pas encore ces valeurs de l'entrée standard. À droite, les variables ne sont pas initialisées, donc au moment de la déclaration du tableau, elles peuvent avoir n'importe quelle valeur.
il s'agit d'un tableau VLA (longueur variable). Le document dit que l'initialisation de VLA n'est pas prise en charge, donc les éléments du tableau ne sont pas complétés avec 0 comme ce serait le cas pour un tableau de taille constante
Utilisez un crochet vide {} pour initialiser le tableau. Cela initialisera tous les éléments du tableau à null par défaut.
s [m] [n] = {0}
n'est même pas un C ++ valide. Essayez plutôt d'utiliser unstd :: vector> std :: vector>
. Par exemple,std :: vector> s (m, std :: vector (n))
vous donnera le comportement que vous attendez.