2016-05-22 3 views
1

ich meine erste rasche Struktur mache, einen Stapel:Array-Stack-Struktur stürzt mit EXC_BAD_INTRUCTION auf popping

struct stack { 
    var Innerarray = [Double]() 
    var pointer=0 
    mutating func push(val: Double) -> Double { 
     self.Innerarray.append((val)) 
     pointer+=1 
     return val 
    } 
    mutating func pop() -> Double { 
     return Innerarray[self.pointer] 
    } 
    init() { 
     self.push(0) 
    } 
} 

Wenn ein Do:

var test = stack() 
test.push(1) 

es funktioniert. Aber wenn ich das tue:

test.pop() 

ich eine ziemlich kryptische Fehlermeldung erhalten:

Ausführung unterbrochen wurde, Grund: EXC_BAD_INTRUCTION (code = EXC_1386_INVOP, Subcode = 0x0)

+0

Was bedeutet die Konsole sagen (hint hint)? – Hamish

+1

Bitte beachten Sie die empfohlene Namenskonvention: Großbuchstaben für Klassen und Strukturen -> 'Stack', Kleinbuchstaben (und Camel Case) für Variablen ->' InnerArray' – vadian

Antwort

2

Sie‘ erhalte einen Array-Index außerhalb des Bereichs. Sie müssen pointer dekrementieren, bevor Sie das innere Array indizieren.

mutating func pop() -> Double { 
    pointer -= 1 
    return Innerarray[self.pointer] 
} 

Sie sollten auch überlegen, was zu tun ist, wenn Ihr Array leer ist. Vielleicht sollte pop eine Double? zurückgeben und nil zurückgeben, wenn der Stapel leer ist.

Sie sollten auch das letzte Element aus Ihrem inneren Array entfernen, oder Ihr nächstes push wird nicht korrekt funktionieren. Die Array-Methode removeLast() könnte nützlich sein, da sie das letzte Element aus einem Array entfernt und es zurückgibt.

0

Wenn Sie aus irgendeinem Grund einen Zeiger manuell verwenden müssen, sollten Sie minus eins erhalten, wenn Sie ihn zurückgeben (oder den Anfangszeiger auf -1 setzen), da die Array-Indizierung bei Null beginnt.

return Innerarray[self.pointer - 1] 

Und tatsächlich können Sie stattdessen letztes Element zurückzukehren verwenden .last einen manuellen Zeiger mit:

return Innerarray.last!