паника: ошибка во время выполнения: makelice: кепка вне диапазона - PullRequest
0 голосов
/ 11 июня 2018

В качестве упражнения для практики Go каждый день, я пытаюсь выполнить одно из ежедневных заданий на 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"},

Следующий эрror брошено:

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"},

Я могу полностью понять, почему ошибка возникает во время выполнения, а не при компиляции, так как нет способа длякомпилятору нужно знать размер сетки во время компиляции, поэтому паника может возникнуть только во время выполнения.

Чего я не понимаю, так это того, что я инвертирую векторы во входных данных:

{"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.

Отладка и выполнение кода, я не могу понять, почемусетка с большим количеством коротких строк вызовет ошибку, а сетка с несколькими длинными строками - нет.

Кажется, здесь есть несколько других ответов, которые могут быть связаны, но я не могуПосмотрите, как я должен изменить свой метод, чтобы избежать ошибки.

Есть идеи?

1 Ответ

0 голосов
/ 11 июня 2018

Согласно ответу Тима Купера, это было простое исправление.

Просто изменил оператор 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 
}

Работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...