2010-08-30 13 views
8

Estoy tratando de inicializar una matriz de Bools así:C++ inicialización del campo que no trabaja

bool FcpNumberIsOk[MAX_FCPS]={true}; 

pero cuando elimino errores, sólo veo el primer elemento de la matriz inicializado, las demás son falsas. ¿Cómo puede ser eso? Estoy usando Qt en ubuntu 10 y la inicialización se realiza en una matriz local dentro de un método.

Ok gracias por sus respuestas.

Respuesta

9

Porque así es como funciona la inicialización de matrices en C++. Si usted no da explícitamente un valor para cada elemento, ese elemento por defecto en cero (o, en este caso, false)

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

Tenga en cuenta que

bool FcpNumberIsOk[MAX_FCPS]; 

fijará todos los valores a falso o haga que se configuren aleatoriamente, dependiendo de dónde esté definido.

+0

¿Cuándo fue que se inicializó la segunda versión? ¿Pensé solo si de manera explícita inicializa la clase/estructura que contiene? –

+2

@jdv, si define la variable como que tiene una duración de almacenamiento estático (estática local/de clase, variables de ámbito de espacio de nombres), se inicializa cero al inicio del programa antes de que ocurra cualquier otra cosa. Ver [¿Qué devuelve principal?] (Http://stackoverflow.com/questions/3309042/what-does-main-return). –

-1

Como ha inicializado explícitamente solo el primer elemento de la matriz, solo el primer elemento se inicializa y el resto no.

+1

El resto * * se inicializa a un valor predeterminado de 0. Es por esto que es seguro de usar 'int i [10] = {0}; 'a 0-inicializar una matriz. – meagar

+0

En realidad, todos los elementos se inicializan. La norma establece que todos los elementos restantes se establecen en 0. –

+0

@meagar, ¿cómo se puede decir que "int i [10] = {0}" hace algo más que establecer 0 en el primer elemento. –

2

Se espera que esto suceda. El primer elemento se inicializa con el valor especificado y el resto se inicializa con el valor por defecto de 0:

int c[5] = {1}; 

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

El uso de esta sintaxis sólo se está inicializando el primer elemento (con el valor de tu y conseguir otro incumplimiento uno [falsa ]), pero no otros. Debe usar int array y memset o para loop para inicializar todos los elementos.

+0

En realidad, todos los elementos se inicializan. La norma establece que todos los elementos restantes se establecen en 0. –

+0

, bueno, quise decir eso. ok, mi error – f0b0s

+1

'memset' funcionará, la mayoría de las veces, pero no es portátil. ':: std :: fill' es mucho mejor y funcionará en una matriz' bool', y en un buen compilador será igual de eficiente. – Omnifarious

10

Has malentendido. Parece que pensaste que cualquier elemento no mencionado se inicializaría al mismo valor que el último valor explícitamente inicializado. El último valor que mencionó fue true, por lo que todos los demás elementos se inicializarán también en true. Una vez tuve esa misma creencia, pero rápidamente aprendí lo contrario.

Así no es como funciona. Los elementos no mencionados se inicializan por defecto, lo que para bool significa false.

Para configurar todos los elementos para true, intentar algo así como std::fill_n:

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