【问题标题】:Xcode 8.2 Swift Compiler Error: "Segmentation Fault: 11"Xcode 8.2 Swift 编译器错误:“分段错误:11”
【发布时间】:2017-01-01 20:15:38
【问题描述】:

当我不通用地实现它时(仅使用整数),这个函数可以正常工作,但是当我让它通用时,只更改几个字母而没有明显错误,Swift 无法编译它;我什至不使用函数,只是让我的项目中的文件崩溃。

Xcode 说“发生了内部错误”。我检查了堆栈跟踪,错误被列为“分段错误: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
}

【问题讨论】:

    标签: swift xcode generics compiler-errors segmentation-fault


    【解决方案1】:

    无论源代码多么“错误”,编译器都不应该崩溃, 所以你可能会考虑提交错误报告。

    在这种情况下,问题似乎是 middleVal 是一个计算 财产。如果你更换

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

    通过

        //core code
        if target > elements[middleIndex] {
            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.
    }
    

    【讨论】:

      【解决方案2】:

      就我而言,在 Swift 3 环境中以旧 Swift 2 格式使用 typealias 时出现此错误,例如:

      (Void -&gt; Void) 代替 (() -&gt; ())

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        相关资源
        最近更新 更多