首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >死机:运行时错误: makeslice:上限超出范围

死机:运行时错误: makeslice:上限超出范围
EN

Stack Overflow用户
提问于 2018-06-11 08:45:36
回答 1查看 2.8K关注 0票数 1

作为每天练习围棋的练习,我每天都会在r/dailyprogrammer上尝试其中一个日常挑战。

目前,我正在实现中间挑战#362 (https://www.reddit.com/r/dailyprogrammer/comments/8n8tog/20180530_challenge_362_intermediate_route/),这是一个简单的加密/解密挑战。

所以在我的方法中,我有一个基本的结构来表示输入:

代码语言:javascript
复制
type Vector struct {
    x, y int
}

type Input struct {
    text   string
    vector Vector
    method string
}

和一段用于挑战输入的结构:

代码语言:javascript
复制
inputs := []Input{
        {"WE ARE DISCOVERED. FLEE AT ONCE", Vector{9, 3}, "clockwise"},
        {"why is this professor so boring omg", Vector{6, 5}, "counter-clockwise"},
        {"Solving challenges on r/dailyprogrammer is so much fun!!", Vector{8, 6}, "counter-clockwise"},
        {"For lunch let's have peanut-butter and bologna sandwiches", Vector{4, 12}, "clockwise"},
        {"I've even witnessed a grown man satisfy a camel", Vector{9, 5}, "clockwise"},
        {"Why does it say paper jam when there is no paper jam?", Vector{3, 14}, "counter-clockwise"},
    }

到现在为止还好。

我有一个简化输入字符串的函数,如挑战中所述(即。函数删除所有标点符号,并用‘X’填充字符串到所需网格的长度)。

之后,我将字符串输入到此函数中,以创建矩阵网格:

代码语言:javascript
复制
func makeGrid(s string, v Vector) [][]byte {
    g := make([][]byte, v.y, v.x)
    for k, c := range s {
        g[k/v.x] = append(g[k/v.x], byte(c))
    }
    return g
}

例如,对于第一个输入,运行程序将生成如下网格(为了便于阅读,下面包含字符串而不是字节):

代码语言:javascript
复制
[[W E A R E D I S C]
 [O V E R E D F L E]
 [E A T O N C E X X]]

但是,当程序达到此输入时:

代码语言:javascript
复制
{"For lunch let's have peanut-butter and bologna sandwiches", Vector{4, 12}, "clockwise"},

抛出以下错误:

代码语言:javascript
复制
panic: runtime error: makeslice: cap out of range

此输入也是如此:

代码语言:javascript
复制
{"Why does it say paper jam when there is no paper jam?", Vector{3, 14}, "counter-clockwise"},

我完全可以理解为什么错误发生在运行时,而不是在编译时,因为编译器在编译期间无法知道网格的大小,所以死机只能在运行时发生。

我不明白的是我反转了输入中的向量:

代码语言:javascript
复制
{"For lunch let's have peanut-butter and bologna sandwiches", Vector{12, 4}, "clockwise"},
{"Why does it say paper jam when there is no paper jam?", Vector{14, 3}, "counter-clockwise"},

不再出现错误。程序运行得很好。

只有在向量中的x值小于y值的情况下才会发生这种情况。

通过调试和跟踪代码,我不太明白为什么包含大量短行的网格会抛出错误,而包含少量长行的网格不会抛出错误。

这里似乎还有几个可能相关的其他答案,但我看不出应该如何修改我的方法来避免错误。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2018-06-11 09:46:59

根据Tim Cooper的回复,这是一个简单的解决方案。

只是更改了make语句以正确使用它:

代码语言:javascript
复制
func makeGrid(s string, v Vector) [][]byte {
    g := make([][]byte, v.y)
    for k, c := range s {
        g[k/v.x] = append(g[k/v.x], byte(c))
    }
    return g 
}

现在工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50789279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档