1
votes

Pourquoi une autre valeur que zéro arrive dans la première ligne?

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 


1 commentaires

s [m] [n] = {0} n'est même pas un C ++ valide. Essayez plutôt d'utiliser un std :: vector> std :: vector > . Par exemple, std :: vector > s (m, std :: vector (n)) vous donnera le comportement que vous attendez.


6 Réponses :


0
votes

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.


0 commentaires

0
votes

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))


1 commentaires

La question est étiquetée C ++, pas C. Les VLA n'existent pas en C ++, et vous utiliseriez std :: fill .



1
votes

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.


3 commentaires

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).



0
votes

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;
    }
}


0 commentaires

0
votes

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.


3 commentaires

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



0
votes

Utilisez un crochet vide {} pour initialiser le tableau. Cela initialisera tous les éléments du tableau à null par défaut.


0 commentaires