2012-11-19 20 views
5

Ich schreibe eine Methode, die eine Kopie eines Arrays von Arrays von Floats erstellt. Ich habe einige extrem seltsame Werte nach dem Debuggen bekommen, also dachte ich, ich würde darüber nachfragen, da ich nicht in der Lage war, das herauszufinden, indem ich über C++ - Array-FAQs las.Null minus Null entspricht unendlich?

Hier ist die relevanten Teile des Codes (es ist Teil eines riesigen Programms, mit dem meisten Sachen irrelevant für diesen Beitrag):

// height and width are integer global variables 
void method() { 
    float testArray[height][width]; 
    for(int j = 0; j < height; ++j) { 
     for(int i = 0; i < width; ++i) { 
      testArray[j][i] -= 0.0; 
      std::cout << testArray[j][i] << std::endl; 
     } 
    } 
} 

(In meinen Tests, Höhe = 32 und width = 256, aber das sollte nicht relevant sein.) Wenn ich testArray initialisiere, sollten seine Werte alle 0.0 sein, korrekt? Dann subtrahiere ich in der Schleife 0.0 von einem bestimmten Element in testArray, was den Wert logisch überhaupt nicht ändern sollte. Aber das Drucken die Werte von testarray als Debugging Schritt Ergebnis in einigen seltsamen Werten wie der folgenden Ausschnitt:

[...] 
0 
[...] 
-3.23805e-24 
[...] 
8.40779e-45 
[...] 
1.79513e+37 
[...] 
0 
[...] 
3.19586e+36 
[...] 

Die allerbedenklichste Werte sind die unendlich diejenigen, wie die vierte Nummer oben aufgeführt ist. Ich weiß ehrlich nicht, warum das passiert. Sollten nicht alle diese Werte immer noch ungefähr 0,0 betragen? Ich dachte, es hätte mit der Ungenauigkeit der Fließkomma-Arithmetik zu tun, aber das sollte nicht zu einem unendlichen Wert führen ....

+7

Wenn Sie das Array initialisieren, sind die Werte nicht. initialisiert auf 0, wird Ihnen nur ein zufälliger Speicherbereich mit der richtigen Größe zugewiesen – Sinkingpoint

+2

Sie sollten sicherstellen, dass Sie auf der höchsten Warnstufe kompilieren, die meisten Compiler sollten Sie warnen, dass Ihr Array nicht initialisiert ist .. –

+0

Wow, das war ein schnelle Lösung, danke, mein Compiler hat n ot warne mich überhaupt. Ich habe keine Ahnung, warum ich dachte, dies würde Werte auf 0 initialisieren ... – TakeS

Antwort

7

Nein, wenn Sie Ihr Array so deklarieren, wird es nicht initialisiert, da es ein eingebauter Typ ist. Sie müssen es vor der Subtraktion auf Null setzen.

Beachten Sie jedoch, dass die Deklaration eines Arrays (mit vermutlich nicht-const-Dimensionen) eine Compiler-Erweiterung und kein Teil der Sprache ist.

Ich würde einfach vector verwenden, die beide Probleme auf einmal löst.

std::vector<std::vector<float> > testArray(height, std::vector<float>(width)); 
+0

Danke für die Antwort. Es gibt einen einfachen Weg für mich, Höhe und Breite als Konstanten zu ändern, also denke ich, dass ich hier bei einer Reihe von Arrays bleiben werde. – TakeS

3

versuchen, die Werte in dem Array initialisiert:

float testArray[height][width] = {}; 
2

Diese Linie schafft eine uninitialized Array Elementwerte jeder garbage sein kann:

float testArray[height][width]; 

um es zu initialisieren mit Schwimmer Standardwerte (Null) verwenden folgende Syntax:

float testArray[height][width] = {}; 
2

DIESE ANTWORT IST FALSCH, ABER ICH VERLASSE ES SO KANN NOONE ES VERSUCHT!

Mit dieser sehr explizite Definition:

float testArray[height][width] = {{0.0f}}; 

, um sicherzustellen, dass jeder Wert im Array auf Null initialisiert wird. Andernfalls sind die Werte im Array nicht definiert. Ich denke, dass dies die "lesbarste" Lösung ist.

WARUM IST ES FALSCH?

Wie @Dave unten erwähnt, obwohl diese Lösung für diesen Fall funktioniert, ist es irreführend. Es ordnet explizit nur das erste Element von testArray zu 0,0, während es value-initializes alle anderen Elemente im Array.

Die richtige Lösung ist in der Tat:

float testArray[height][width] = {}; 

, die alle Elemente in dem Array Wert initialisiert (auf den Standardwert 0.0f für Typ float

+1

Dies würde nicht kompilieren, es soll '{{0.0}}' ' – Rost

+0

@Rost Sie sind völlig richtig. – dinkelk

+3

-1 Dies ist trügerisch, wenn auch ein unglaublich häufiger Fehler. Was Sie geschrieben haben, weist 1 Element eindeutig zu "0.0" zu (sollte übrigens '0.0f' oder' .0f' sein) und value-initialisiert den Rest der Elemente (die im Falle von float, initialisiert sie zu '0.0f '). Am besten schreiben Sie '= {};' mit * no * value; oder um explizit einen Wert für jedes Element zu schreiben (nicht immer praktisch). – David

Verwandte Themen