操场上swift EXC_BAD_INSTRUCTION错误

时间:2018-03-13 04:09:28

标签: swift swift-playground

我有以下测试代码......

def extract(node):
    if isinstance(node, tuple):
        return extract(node[1])
    if isinstance(node, list):
        result = []
        for item in node:
            for sublist in extract(item):
                for elem in sublist:
                    result.append(elem)
        return result
    return node

有关导致错误的原因的任何线索?我知道,如果我发表以下评论......

import Foundation

var n = 5

let binSlots = 64
var numOfOnes = 0
var inSequence = false

func toThePower(number: Int, power: Int) -> Int {
    var ans = number
    for _ in 1..<power  {
        ans = ans * number
    }
    return ans
}

// the following line is fine
if n <= toThePower(number: 2, power: 4) {
    print("ok")
}

for i in stride(from: binSlots, through: 0, by: -1) {
    // the following line produces this error:
    // // error: Execution was interrupted, reason: 
    // EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
    let pCalc = toThePower(number: 2, power: i) 

    if n >= pCalc {
        n = n - pCalc
        numOfOnes += 1
        inSequence = true
    }
    else {
        if inSequence {
            break
        }
    }
}

错误消失然而我不知道为什么或为什么第一次调用函数运行没有错误。

我看了其他类似的帖子,但没有一个与我的情况类似。

感谢您的帮助。

谢谢。

1 个答案:

答案 0 :(得分:1)

您的错误来自toThePower函数中的此行:

for _ in 1..<power  {

问题是范围的右侧不能小于范围的左侧。

该行:

for i in stride(from: binSlots, through: 0, by: -1) {

会导致您调用toThePower功能,其功率降至0并包括0。

0小于1,因此崩溃。

变化:

for i in stride(from: binSlots, through: 0, by: -1) {

为:

for i in stride(from: binSlots, through: 1, by: -1) {

避免崩溃。