2017-01-01 6 views
4

この関数は、一般的に(intを使用して)実装していないときに正しく動作しますが、一般的なものにするときには、エラー、Swiftはコンパイルできません。私はfuncを使っていなくても、単に私のプロジェクトのファイルをクラッシュさせるだけです。Xcode 8.2 Swiftコンパイラエラー:「セグメンテーションフォールト:11」

Xcodeによれば、「内部エラーが発生しました。私は、スタックトレースをチェックし、エラーは "Segmentation Fault:11"と表示されます。私は下に私のコードを掲載します。

リクエストに応じてスタックトレースを送信することもできます。

import Foundation 

func BinSearch<T : Comparable>(elements: [T], target: T) -> Int?{ 
    let maxIndex = elements.count - 1 
    var rightIndex = maxIndex 
    var leftIndex = 0 
    var middleIndex : Int {return lround(Double((rightIndex + leftIndex))/2)} 

    var maxVal : T {return elements[rightIndex]} 
    var middleVal : T {return elements[middleIndex]} 
    var minVal : T {return elements[leftIndex]} 

    while elements[middleIndex] != target { 
     //test if in infinite loop for target within range of array but DNE 
     if leftIndex == middleIndex || rightIndex == middleIndex && rightIndex != 1{ 
      return nil 
     } 

     //prevent infinite loop due to rounding method 
     if rightIndex == 1 { 
      return leftIndex 
     } 

     //core code 
     if target > middleVal { 
      leftIndex = middleIndex 
     }else { 
      rightIndex = middleIndex 
     } 
    } 
    return middleIndex 
} 

答えて

1

コンパイラはあなたがバグレポートを提出するために検討するかもしれない、関係なく、ソースコードがどのように「間違っている」、 をクラッシュしないべきではありません。

この場合、問題はmiddleValが計算された プロパティであるようです。あなたは

//core code 
    if target > elements[middleIndex] { 
     leftIndex = middleIndex 
    }else { 
     rightIndex = middleIndex 
    } 

によって

//core code 
    if target > middleVal { 
     leftIndex = middleIndex 
    }else { 
     rightIndex = middleIndex 
    } 

を交換する場合、コードがコンパイルされます。ただし、正しく動作しません。 例えば

BinSearch(elements: [3, 4, 5], target: 2) 

戻り0代わりにnil。 (。。また、私はmiddleIndexmiddleValため 計算されたプロパティを使用して何のメリットを見ない maxValminValがあなたのコードでは全く使用されていない)

ここでは、(http://rosettacode.org/wiki/Binary_search#Swiftに触発さ)正しく動作実装 の例です。私の場合は

func binarySearch<T : Comparable>(elements: [T], target: T) -> Int? { 
    var leftIndex = 0 
    var rightIndex = elements.count - 1 

    while leftIndex <= rightIndex { 
     let middleIndex = (leftIndex + rightIndex)/2 
     if elements[middleIndex] < target { 
      leftIndex = middleIndex + 1 // Continue search in upper half. 
     } else if target < elements[middleIndex] { 
      rightIndex = middleIndex - 1 // Continue search in lower half. 
     } else { 
      return middleIndex // Found. 
     } 
    } 
    return nil // Not found. 
} 
1

例えば、スウィフト3環境で古いスウィフト2フォーマットでtypealiasを使用したとき、私はこのエラーを得た:

(Void -> Void) の代わりに (() ->())

の代わりに
関連する問題