2016-06-10 2 views
1

Ich versuche, eine func zu entwickeln, die zwei Matrizen summieren kann, wenn sie gleich auf die gleiche Dimension, aber ich erhalte eine Fehlermeldung „EXC_BAD_INSTRUCTION“ auf dem try ..Swift Matrix Summe

jemand eine Idee ? Ich bin total in dieser Zeit blockiert ..

Hier ist mein Spielplatz:

import UIKit 

enum RisedError: ErrorType { 
    case DimensionNotEquals 
    case Obvious(String) 
} 

func ==(lhs: Matrix, rhs: Matrix) -> Bool { 
    return (lhs.rows) == (rhs.rows) && (lhs.columns) == (rhs.columns) 
} 

protocol Operation { 
    mutating func sumWith(matrixB: Matrix) throws -> Matrix 
} 

struct Matrix { 
    let rows: Int, columns: Int 
    var grid: [Double] 
    init(rows: Int, columns: Int) { 
     self.rows = rows 
     self.columns = columns 
     grid = Array(count: rows * columns, repeatedValue: 0.0) 
    } 
    func indexIsValidForRow(row: Int, column: Int) -> Bool { 
     return row >= 0 && row < rows && column >= 0 && column < columns 
    } 
    subscript(row: Int, column: Int) -> Double { 
     get { 
      assert(indexIsValidForRow(row, column: column), "Index out of range") 
      return grid[(row * columns) + column] 
     } 
     set { 
      assert(indexIsValidForRow(row, column: column), "Index out of range") 
      grid[(row * columns) + column] = newValue 
     } 
    } 
} 

var matrixA = Matrix(rows: 2, columns: 2) 
matrixA[0,0] = 1.0 
matrixA[0,1] = 2.0 
matrixA[1,0] = 3.0 
matrixA[1,1] = 4.0 
var matrixB = Matrix(rows: 2, columns: 2) 
matrixB[0,0] = 5.0 
matrixB[0,1] = 6.0 
matrixB[1,0] = 7.0 
matrixB[1,1] = 8.0 

print(matrixA) 
print(matrixB) 


extension Matrix: Operation { 

    mutating func sumWith(matrixB: Matrix) throws -> Matrix { 

     guard self == matrixB else { throw RisedError.DimensionNotEquals } 

     for row in 0...self.rows { 
      for column in 0...self.columns { 
       self[row, column] = matrixB[row, column] + self[row, column] 
      } 
     } 
     return self 
    } 

} 

do { 
    try matrixA.sumWith(matrixB) 
} catch RisedError.DimensionNotEquals { 
    print("The two matrix's dimensions aren't equals") 
} catch { 
    print("Something very bad happens") 
} 

Hier ist der Fehler-Log:

enter image description here

+0

Können Sie den Rest des Fehlerprotokolls anzeigen? – Fogmeister

+4

Definierst du 'A == B' wirklich, wenn nur die Matrix * Dimensionen * gleich sind? –

+0

Wenn etwas unerwartetes auf dem Spielplatz passiert: 1) Verwenden Sie stattdessen ein kompiliertes Projekt und 2) verwenden Sie den * Debugger *, um den Code in einem Schritt zu durchlaufen. In Ihrem Fall von 2x2-Matrizen würde das Problem fast sofort sichtbar werden! –

Antwort

1

Das Problem ist, Sie verwenden die closed range operator in Ihrer for-Schleife 0...self.rows. Dies schließt die obere Grenze des Bereichs in der Iteration ein, die in Ihrem Fall außerhalb der Grenzen liegt und daher abstürzen wird.

Sie wollen ..< den halboffenen Bereich Operator verwenden, anstatt:

for row in 0..<self.rows { 
    for column in 0..<self.columns { 
     self[row, column] = matrixB[row, column] + self[row, column] 
    } 
} 

Dies wird iteriert bis zu, aber nicht einschließlich der oberen Grenze.


ich auch @MartinR's comment above würde beachten - von den Abmessungen allein werden die Definition der Gleichstellung für die Matrizen die gleiche scheint unlogisch basiert. Denken Sie daran, dass Gleichheit bedeutet Substituierbarkeit (d. H. Wenn a == b, a und b sind austauschbar).

würde ich in Erwägung ziehen, Ihre == beiden Dimensionen und Werte zu überprüfen, und dann Ihre eigene Dimension Prüfung in Ihrer sumWith Methode implementieren (oder eine neue Methode erstellen Dimensionen vergleichen).

1

Eigentlich ist Ihr Fehler Index mit diesem Code außerhalb des zulässigen Bereichs

Ersetzen Sie Ihre Erweiterung.

extension Matrix: Operation { 

    mutating func sumWith(matrixB: Matrix) throws -> Matrix { 

     guard self == matrixB else { throw RisedError.DimensionNotEquals } 

     for row in 0...self.rows - 1 { 
      for column in 0...self.columns - 1 { 
       self[row, column] = matrixB[row, column] + self[row, column] 
      } 
     } 
     return self 
    } 
} 

Ich hoffe, es würde Ihr Problem lösen.

+0

Schande über mich .. Sie lösten mein Problem :) –

+1

es ist meine plesure :) – Bhumi