2010-08-30 13 views
8

Sto cercando di inizializzare un array di Caccio modo:C++ inizializzazione matrice non funzionante

bool FcpNumberIsOk[MAX_FCPS]={true}; 

ma quando il debug esso, vedo solo il primo elemento della matrice inizializzata, le altre sono false. Come può essere così? Sto usando Qt su Ubuntu 10 e l'inizializzazione viene eseguita su un array locale all'interno di un metodo.

Ok grazie per le vostre risposte.

risposta

9

Perché questo è il modo in cui l'inizializzazione dell'array funziona in C++. Se non esplicitamente dare un valore per ogni elemento, quell'elemento default è pari a zero (o, qui, false)

bool FcpNumberIsOk[MAX_FCPS]={true, true, true, true /* etc */ }; 

Nota che

bool FcpNumberIsOk[MAX_FCPS]; 

imposterà tutti i valori su false o farli impostare in modo casuale, a seconda di dove è definito.

+0

Quando è stata inizializzata la seconda versione? Ho pensato solo se hai impostato in modo esplicito l'inizializzazione della classe contenente/struct? –

+2

@jdv, se si definisce la variabile come durata dell'archiviazione statica (statica locale/di classe, variabili dell'ambito dei nomi), viene inizializzata a zero all'avvio del programma prima che avvenga qualsiasi altra cosa. Vedi [Che cosa è il ritorno principale?] (Http://stackoverflow.com/questions/3309042/what-does-main-return). –

-1

Poiché è stato inizializzato in modo esplicito solo il primo elemento dell'array, solo il primo elemento viene inizializzato e il rimanente no.

+1

Il resto sono * * inizializzati ad un valore predefinito di 0. Questo è il motivo per cui è sicuro da usare 'int i [10] = {0}; 'a 0-inizializza una matrice. – meagar

+0

In realtà tutti gli elementi vengono inizializzati. Lo standard afferma che tutti gli elementi rimanenti sono impostati su 0. –

+0

@meagar come si può dire che "int i [10] = {0}" fa qualcosa di diverso da impostare 0 sul primo elemento. –

2

Questo è il comportamento previsto. Il primo elemento è inizializzato al valore specificato e il resto vengono inizializzati al valore di default di 0:

int c[5] = {1}; 

// 1 0 0 0 0 
for(int i = 0; i < 5; ++i) 
    std::cout << c[i] << ' '; 
-1

Utilizzando questa sintassi si sta solo l'inizializzazione del primo elemento (con il proprio valore e ottenere altri default-uno [falso ]), ma non altri. Si dovrebbe usare sia int array e memset o for loop per inizializzare tutti gli elementi.

+0

In realtà tutti gli elementi vengono inizializzati. Lo standard afferma che tutti gli elementi rimanenti vengono impostati su 0. –

+0

beh, intendevo quello. ok, mio ​​errore – f0b0s

+1

'memset' funzionerà, il più delle volte, ma non è portatile. ':: std :: fill' è molto meglio e funzionerà su una matrice' bool', e su un buon compilatore sarà altrettanto efficiente. – Omnifarious

10

Hai frainteso. Sembra che tu che tutti gli elementi non menzionati vengano inizializzati allo stesso valore dell'ultimo valore inizializzato esplicitamente. L'ultimo valore che hai menzionato era true, quindi tutti gli altri elementi sarebbero stati inizializzati su true. Una volta ho avuto la stessa convinzione, ma ho presto imparato il contrario.

Non è così che funziona. Qualsiasi elemento non menzionato viene inizializzato automaticamente, che per bool significa false.

Per impostare tutti gli elementi per true, provare qualcosa di simile std::fill_n:

std::fill_n(FcpNumberIsOk, MAX_FCPS, true);