2016-04-29 52 views
1

我跑在Xcode 7beta/RC游乐场项目相同的代码,并得到了一个错误:EXC_I386_GPFLT斯威夫特代码中使用Xcode的游乐场

Execution was interrupted, reason: EXC_BAD_ACCESS(code=EXC_I386_GPFLT)

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

如何在游乐场项目,因为解决其他解决方案似乎不相关?

二叉树: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())") 

回答

2

Process.arguments认为,作为一个命令行应用程序参数传递的值。

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

解决方案是在实际的应用程序中使用它,而不是在游乐场中。

0

可以使用自定义“的readLine()”函数和全局输入变量,该输入阵列中的每个元素被呈现的行:

import Foundation 

var currentLine = 0 
let input = ["5", "5 6 3"] 

func readLine() -> String? { 
    if currentLine < input.endIndex { 
     let line = input[currentLine] 
     currentLine += 1 
     return line 
    } else { 
     return nil 
    } 
} 

let firstLine = readLine() // 5 
let secondLine = readLine() // 5 6 3 
let thirdLine = readLine() // nil