2010-08-30 12 views
8

próbuję zainicjować tablicę bools tak:C++ inicjalizacji tablicy nie działa

bool FcpNumberIsOk[MAX_FCPS]={true}; 

ale kiedy debugować go, widzę tylko pierwszy element tablicy zainicjowany, pozostałe są fałszywe. Jak to możliwe? Używam Qt na Ubuntu 10, a inicjalizacja odbywa się na lokalnej tablicy wewnątrz metody.

Ok, dzięki za odpowiedzi.

Odpowiedz

9

Ponieważ w ten sposób inicjowanie macierzy działa w C++. Jeśli nie wyraźnie daje wartość dla każdego elementu, który domyślnie elementem zera (lub, tutaj, false)

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

pamiętać, że

bool FcpNumberIsOk[MAX_FCPS]; 

ustawia wszystkie wartości do fałszywego lub ustawić je losowo, w zależności od tego, gdzie jest to zdefiniowane.

+0

Kiedy została zainicjowana druga wersja? Myślałem tylko, jeśli jawnie domyślnie-zainicjować zawierający klasy/struct? –

+2

@jdv, jeśli zdefiniujesz zmienną jako mającą czas przechowywania statycznego (statyka lokalna/klasa, zmienne zakresu przestrzeni nazw), inicjalizowana jest ona zero podczas startu programu, zanim cokolwiek innego nastąpi. Zobacz [Co to jest główny zwrot?] (Http://stackoverflow.com/questions/3309042/what-does-main-return). –

-1

Ponieważ jawnie zainicjowano tylko pierwszy element tablicy, inicjowany jest tylko pierwszy element, a pozostałe nie.

+1

Pozostała * * inicjowane są domyślnie 0. To dlatego jest bezpieczny w użyciu 'int i [10] = {0}; 'na 0-zainicjować tablicę. – meagar

+0

Właściwie wszystkie elementy są inicjowane. Standard stwierdza, że ​​wszystkie pozostałe elementy są ustawione na 0. –

+0

@meagar jak możesz powiedzieć, że "int i [10] = {0}" robi cokolwiek innego niż ustaw 0 na pierwszym elemencie. –

2

Jest to oczekiwane zachowanie. Pierwszym elementem jest inicjowany do określonej wartości i pozostałej są inicjowane na wartość domyślną 0:

int c[5] = {1}; 

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

Używając tej składni jesteś inicjowanie tylko pierwszy element (z telefonem na wartość i inne get default-onu [false ]), ale nie innych. Powinieneś użyć zarówno tablicy int i memset, jak i pętli do zainicjowania wszystkich elementów.

+0

Właściwie wszystkie elementy są inicjowane. Standard stwierdza, że ​​wszystkie pozostałe elementy są ustawione na 0. –

+0

dobrze, co miałem na myśli. ok, mój błąd. – f0b0s

+1

'memset' będzie działał przez większość czasu, ale nie jest przenośny. ':: std :: fill' jest znacznie lepszy i będzie działać na tablicy' bool', a na dobrym kompilatorze będzie równie skuteczny. – Omnifarious

10

Źle zrozumiałeś. Wygląda jednak na to, że wszelkie nie wymienione elementy zostaną zainicjowane na tę samą wartość, co ostatnio jawnie zainicjowana wartość. Ostatnia wymieniona wartość to true, więc wszystkie pozostałe elementy zostaną również zainicjowane na true. Miałem kiedyś takie samo przekonanie, ale szybko nauczyłem się czegoś innego.

To nie tak działa. Wszelkie niewymienione elementy zostają domyślnie zainicjowane, co oznacza bool oznacza .

Aby ustawić wszystkie elementy do true, spróbuj coś takiego std::fill_n:

std::fill_n(FcpNumberIsOk, MAX_FCPS, true); 
Powiązane problemy