本文介绍了使用 Xcode Playground 的 Swift 代码中的 EXC_I386_GPFLT的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 Xcode 7beta/rc Playground 项目中运行相同的代码并得到一个错误:

I ran the same code in Xcode 7beta/rc Playground project and got an error:

执行被中断,原因:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)

let n: Int = Int(Process.arguments[1])!

我如何在 Playground 项目中解决,因为其他解决方案似乎不相关?

How do I solve in Playground project since other solutions don't seem to be related?

二叉树:http:///benchmarksgame.alioth.debian.org/u64q/program.php?test=binarytrees&lang=swift&id=1

class TreeNode {
    var left, right : TreeNode?
    var item : Int

    init(_ left: TreeNode?, _ right: TreeNode?, _ item: Int) {
        self.left = left
        self.right = right
        self.item = item
    }

    func check() -> Int {
        guard let left = left, let right = right else {
            return item
        }
        return item + left.check() - right.check()
    }
}

func bottomUpTree(item: Int, _ depth: Int) -> TreeNode {
    if depth > 0 {
        return
            TreeNode(
                bottomUpTree(2*item-1, depth-1),
                bottomUpTree(2*item, depth-1),
                item
        )
    }
    else {
        return
            TreeNode(nil,nil,item)
    }
}


let n: Int = Int(Process.arguments[1])!
let minDepth = 4
let maxDepth = n
let stretchDepth = n + 1

let check = bottomUpTree(0,stretchDepth).check()
print("stretch tree of depth \(stretchDepth)\t check: \(check)")

let longLivedTree = bottomUpTree(0,maxDepth)

var depth = minDepth
while depth <= maxDepth {
    let iterations = 1 << (maxDepth - depth + minDepth)
    var check = 0
    for i in 0..<iterations {
        check += bottomUpTree(i,depth).check()
        check += bottomUpTree(-i,depth).check()
    }
    print("\(iterations*2)\t trees of depth \(depth)\t check: \(check)")
    depth += 2
}

print("long lived tree of depth \(maxDepth)\t check: \(longLivedTree.check())")

推荐答案

Process.arguments 保存作为命令行应用程序参数传递的值.

Process.arguments holds the value that is passed as arguments for a command-line application.

但是您在 Playground 中使用它:无法访问来自 Playground 的命令行输入(它们是沙盒的),因此 Process.arguments 为零并且您的应用程序在您使用时崩溃做 Process.arguments[1].

But you're using it in a Playground: there's no access to command line input from a Playground (they are Sandboxed), so Process.arguments is nil and your app crashes when you're doing Process.arguments[1].

解决方案是在实际应用中使用它,而不是在 Playground 中使用.

The solution is to use this in an actual application, not in a Playground.

这篇关于使用 Xcode Playground 的 Swift 代码中的 EXC_I386_GPFLT的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-13 15:34