【问题标题】:swift playground error BAD_INSTRUCTION快速操场错误 BAD_INSTRUCTION
【发布时间】:2017-07-30 02:04:11
【问题描述】:

所以我有以下贪心算法,它给了我以下错误:

Playground 执行中止:错误:执行被中断, 原因:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)。这 进程被留在中断的地方,使用 "thread return -x" 返回表达式之前的状态 评估。

类:

// This class represents an undirected graph using adjacency list
public class Graph{
    var V: Int // number of vertices
    var adj: [[Int]] = [[]] //Adjacency List

    public init(v: Int) {
        V = v
        adj = [[Int]](repeating: [], count: v)
    }

    // Function to add an edge into the graph
    public func addEdge(v: Int, w: Int){
        adj[v].append(w)
        adj[w].append(v) // Graph is undirected
    }

    // Assigns colors (starting from 0) to all vertices and
    // prints the assignment of colors
    public func greedyColoring() {
        var result = [Int]()

        //Assign the first color to first vertex
        result[0] = 0

        //Initialize the remaining V-1 vertices as unassigned
        for i in 0 ..< V{
            //No Color is assigned
            result[i] = -1
        }

        // A temporary array to store the available colors. True
        // value of available[cr] would mean that the color cr is
        // assigned to one of its adjacent vertices
        var available = [Bool]()
        for cr in 0 ..< V{
            available[cr] = false
        }

        // Assign colors to remaining V-1 vertices
        for i in 1 ..< V{
            //Process all adjacent vertices and flag their colors as unavailable
            for un in 0 ..< adj[i].count{
                if result[un] != -1 {
                    available[result[un]] = true
                }
            }

            //find the first available color
            for cr in 0 ..< V{
                if available[cr] == false{
                    result[i] = cr
                    break
                }
            }

            //Reset the values back to false for the next iteraation
            for un in 0 ..< adj[i].count{
                if result[un] != -1 {
                    available[result[un]] = true
                }
            }
        }

        //Print result
        for r in 0 ..< V{
            print("Vertex \(r) --> Color \(result[r])")
        }
    }
}

我这样称呼它:

import Foundation
import UIKit
import XCPlayground

var g1 = Graph(v: 5)
g1.addEdge(v: 0, w: 1)
g1.addEdge(v: 0, w: 2)
g1.addEdge(v: 1, w: 2)
g1.addEdge(v: 1, w: 3)
g1.addEdge(v: 2, w: 3)
g1.addEdge(v: 3, w: 4)
g1.greedyColoring() // Fails HERE

所以我之前在某些行中遇到了这个错误,这与我使用数组的方式有关。为什么 Playground 没有给出像 index out of bounds or so? 这样的确切错误我的调试控制台什么也没打印...是什么导致了我的代码中的错误?

【问题讨论】:

    标签: swift xcode swift-playground


    【解决方案1】:

    在这段代码中sn-p:

    var result = [Int]()
    
    //Assign the first color to first vertex
    result[0] = 0
    

    数组result 为空,因此您无法通过result[0] 访问第一个元素。

    解决方案:

    更改自:

    var result = [Int]()
    
    //Assign the first color to first vertex
    result[0] = 0
    
    //Initialize the remaining V-1 vertices as unassigned
    for i in 0 ..< V{
        //No Color is assigned
        result[i] = -1
    }
    
    // A temporary array to store the available colors. True
    // value of available[cr] would mean that the color cr is
    // assigned to one of its adjacent vertices
    var available = [Bool]()
    for cr in 0 ..< V{
        available[cr] = false
    }
    

    收件人:

    var result = [Int]()
    
    //Assign the first color to first vertex
    result.append(0)
    
    //Initialize the remaining V-1 vertices as unassigned
    for _ in 0 ..< V{
        //No Color is assigned
        result.append(-1)
    }
    
    // A temporary array to store the available colors. True
    // value of available[cr] would mean that the color cr is
    // assigned to one of its adjacent vertices
    var available = [Bool]()
    for _ in 0 ..< V{
        available.append(false)
    }
    

    【讨论】:

    • 完美,有没有办法更好地调试 Playground?
    • 我的日志打印出fatal error: Index out of range,你呢?
    • 我的 xcode 只显示我发布的错误,而不是在日志中。
    • 你打开调试控制台了吗?尝试按 ⇧ + ⌘ + C。
    • 如果我将图形代码从单独的类切换到主操场,调试控制台会显示错误(索引超出范围)
    【解决方案2】:

    只写:

    import PlaygroundSupport
    

    对我有帮助

    【讨论】:

    • 不管你有什么代码,这似乎都是解决 Playground 错误的正确方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 2014-07-26
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多