2015-11-10 22 views
5

Stavo cercando di eseguire il debug del mio codice in un'altra funzione quando sono incappato in questo comportamento "strano".Matrice non azzerata sulla dichiarazione

#include <stdio.h> 

#define MAX 20 

int main(void) { 
    int matrix[MAX][MAX] = {{0}}; 

    return 0; 
} 

Se ho impostato un punto di interruzione sulla linea return 0; e guardo le variabili locali con Code :: Blocks la matrice non è del tutto pieno di zeri. La prima riga è, ma il resto dell'array contiene solo spazzatura casuale.

so di poter fare un doppio for ciclo per inizializzare tutto manualmente a zero, ma non era lo standard C dovrebbe colmare questa matrice a zero con il {{0}} inizializzatore?

Forse perché è stata una lunga giornata e sono stanco, ma avrei giurato che lo sapevo.

ho provato a compilare con i diversi standard (con il Code :: Blocks bundle gcc compilatore): -std=c89, -std=c99, std=c11 ma è lo stesso.

Qualche idea di cosa c'è che non va? Potresti spiegarmelo?

MODIFICA: Mi sto chiedendo in particolare l'inizializzatore {{0}}.

Ho sempre pensato che avrebbe riempito tutte le colonne e tutte le righe a zero.

EDIT 2: Sono preoccupato specificatamente con Code::Blocks e il pacchetto GCC. Altri commenti dicono che il codice funziona su diverse piattaforme. Ma perché non dovrebbe funzionare per me? :/

Grazie.

+1

bene questa risposta dice che lo stai facendo bene http://stackoverflow.com/a/1688758/1339987 – djechlin

+0

Utilizzo 2- le matrici dimensionali sono qualcosa che le persone amano fare a scuola, ma in pratica spesso causano più problemi di quanti ne valga la pena. Perché non usare solo un array monodimensionale, dove si presume che i primi elementi MAX siano la prima riga, i successivi MAX elementi sono la seconda riga, ecc. dereferenziazione per matrice [riga * NCOLS + col]; In tal caso, è possibile inizializzarlo più facilmente come semplicemente matrice [NCOLS * NROWS] = {0}; – Dmitri

+0

@Dmitri perché devi assumere il primo Gli elementi MAX sono la prima riga, la matematica, la deferenza con più matematica - Credo che tu abbia risposto alla tua domanda: P – djechlin

risposta

3

L'ho capito.

Anche senza alcun flag di ottimizzazione del compilatore, debugger l'informazione era solo sbagliato ..

Così ho stampato i valori con due for loops ed è stato inizializzato correttamente, anche se il debugger detto altrimenti (strano) .

Grazie comunque per i commenti

-1

Il codice dovrebbe inizializzare a zero. Infatti, puoi semplicemente fare int matrix[MAX][MAX] = {};, e sarà inizializzato a 0. Tuttavia, int matrix[MAX][MAX] = {{1}}; imposterà solo la matrice [0] [0] a 1, e tutto il resto a 0.

Sospetto che cosa stai osservando con Code :: Blocks è che il debugger (gdb?) Non ti mostra esattamente dove si sta infrangendo il codice - o quello o qualche altro effetto collaterale dall'ottimizzatore. Per verificare tale teoria, aggiungere il seguente ciclo immediatamente dopo l'inizializzazione:

`` `int i, j;

for (i = 0; i < MAX; i++) 
    for (j = 0; j < MAX; j++) 
    printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j]); 

`` `

e vedere se quello che viene stampato è coerente con l'uscita del debugger.

Ho intenzione di indovinare che ciò che potrebbe accadere è che dal momento che non si utilizza Matrix, l'ottimizzatore potrebbe aver deciso di non inizializzarlo. Per verificare, disassemblare il tuo principale (disass main in gdb e vedere se la matrice è effettivamente inizializzata

+1

'int matrix [MAX] [MAX] = {};' non è consentito in Standard C –

+0

Ho già trovato la risposta. Non si può semplicemente mettere il '{}' senza zero in esso, e una doppia parentesi è meglio '{{0}}'. Anche l'array è stato inizializzato correttamente, ho capito che il debugger stava solo mostrando le celle sbagliate o il compilatore stava facendo qualche ottimizzazione sotto il cofano (senza che io impostassi alcun flag di ottimizzazione) – Zorgatone

+0

Inoltre stavo usando la matrice più avanti nel codice , Non sto mostrando il resto del programma perché è irrilevante, perché sto mettendo in pausa il debugger subito dopo la dichiarazione e l'inizializzazione – Zorgatone

Problemi correlati