gpt4 book ai didi

go - panic : runtime error: makeslice: cap out of range

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:41 27 4
gpt4 key购买 nike

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

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

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

type Vector struct {
x, y int
}

type Input struct {
text string
vector Vector
method string
}

以及挑战输入的一部分结构:

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”填充字符串以达到所需网格的长度)。

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

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
}

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

[[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]]

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

{"For lunch let's have peanut-butter and bologna sandwiches", Vector{4, 12}, "clockwise"},

抛出以下错误:

panic: runtime error: makeslice: cap out of range

此输入相同:

{"Why does it say paper jam when there is no paper jam?", Vector{3, 14}, "counter-clockwise"},

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

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

{"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 值的情况下。

调试并跟踪代码,我不太明白为什么有很多短行的网格会抛出错误,而长行很少的网格不会。

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

有什么想法吗?

最佳答案

根据 Tim Cooper 的回复,这是一个简单的修复。

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

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
}

现在工作正常。

关于go - panic : runtime error: makeslice: cap out of range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50789279/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com