2010-08-30 14 views
8

Ich versuche, eine Reihe von bools wie so zu initialisieren:C++ Array Initialisierung funktioniert nicht

bool FcpNumberIsOk[MAX_FCPS]={true}; 

aber wenn ich es debuggen, ich nur das erste Element des Arrays initialisiert sehen, die anderen sind falsch. Wie kann das so sein? Ich benutze Qt auf Ubuntu 10 und die Initialisierung wird auf einem lokalen Array innerhalb einer Methode durchgeführt.

Ok danke für Ihre Antworten.

Antwort

9

Weil das Array-Initialisierung in C++ funktioniert. Wenn Sie nicht explizit einen Wert für jedes Element geben, das Element standardmäßig auf Null (oder hier false)

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

Beachten Sie, dass

bool FcpNumberIsOk[MAX_FCPS]; 

alle Werte auf false gesetzt wird oder lassen Sie sie zufällig setzen, abhängig davon, wo dies definiert ist.

+0

Wann wurde die zweite Version initialisiert? Ich dachte nur, wenn Sie die enthaltene Klasse/Struktur explizit default-initialisieren. –

+2

@jdv, wenn Sie die Variable so definieren, dass sie statische Speicherdauer hat (local/class statics, Namespace scope-Variablen), wird sie beim Programmstart initialisiert, bevor irgendetwas anderes stattfindet. Siehe [Was kommt hauptsächlich zurück?] (Http://stackoverflow.com/questions/3309042/what-does-main-return). –

-1

Da Sie nur das erste Element des Arrays explizit initialisiert haben, wird nur das erste Element initialisiert und die restlichen nicht.

+1

Der Rest * sind * auf einen Standardwert von 0 initialisiert Aus diesem Grund ist es sicher ist, 'zu verwenden int i [10] = {0}; 'um 0 ein Array zu initialisieren. – meagar

+0

Eigentlich werden alle Elemente initialisiert. Der Standard besagt, dass alle verbleibenden Elemente auf 0 gesetzt werden. –

+0

@meagar Wie kannst du sagen, dass "int i [10] = {0}" alles andere als 0 auf dem ersten Element setzt. –

2

Dies ist das erwartete Verhalten. Das erste Element auf den angegebenen Wert und dem Rest initialisiert werden auf den Standardwert von 0 initialisiert:

int c[5] = {1}; 

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

Mit dieser Syntax Sie nur das erste Element der Initialisierung (mit Ihrem Wert und andere get default-one [falsch ]), aber nicht andere. Sie sollten entweder int-Array und memset oder for-Schleife verwenden, um alle Elemente zu initialisieren.

+0

Eigentlich werden alle Elemente initialisiert. Der Standard besagt, dass alle verbleibenden Elemente auf 0 gesetzt werden. –

+0

nun, ich meinte das. Ok, mein Fehler. – f0b0s

+1

"memset" wird die meiste Zeit funktionieren, ist aber nicht tragbar. ':: std :: fill' ist viel besser und wird auf einem' bool'-Array arbeiten, und auf einem guten Compiler wird es genauso effizient sein. – Omnifarious

10

Sie haben missverstanden. Offenbar werden alle nicht erwähnten Elemente auf den gleichen Wert initialisiert wie der letzte explizit initialisierte Wert. Der letzte von Ihnen erwähnte Wert war true, daher würden alle weiteren Elemente auch auf true initialisiert werden. Ich hatte einmal denselben Glauben, aber ich habe schnell etwas anderes gelernt.

So funktioniert das nicht. Alle nicht erwähnten Elemente werden standardmäßig initialisiert, was für boolfalse bedeutet.

So stellen Sie alle Elemente zu true, versuchen Sie so etwas wie std::fill_n:

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