2015-07-29 6 views
5

У меня есть следующий код, который используется, чтобы найти два целых числа, что сумма к данной сумме в данном срезе:Golang паника: ошибка во время выполнения: индекс вне диапазона происходит только при запуске вне отладчика

type Store_object struct { 
    C  int 
    I  int 
    Prices []int 
} 
//..other unrelated functions... 

func FindItemPairs(scenarios []Store_object) ([]string, error) { 
    var results []string 
    for scIndex := 0; scIndex < len(scenarios); scIndex++ { 
     scenario := scenarios[scIndex] 
     for prIndex := 0; prIndex < len(scenario.Prices); prIndex++ { //<--!sc 
      firstItem := scenario.Prices[prIndex] 
      if firstItem >= scenario.C { 
       continue 
      } 
      for cmpIndex := prIndex + 1; cmpIndex < len(scenario.Prices); cmpIndex++ { 
       secondItem := scenario.Prices[cmpIndex] 

       switch { 
       case secondItem >= scenario.C: 
        continue 
       case firstItem+secondItem == scenario.C: 
        result := "Case #" + strconv.Itoa(scIndex+1) + 
         " " + strconv.Itoa(firstItem) + " " + 
         strconv.Itoa(secondItem) 
        results = append(results, result) 
       } 
      } 
     } 
    } 
    return results, nil 
} 

однако, когда Я пытаюсь запустить свой код, чтобы найти пары записи, я получаю следующее сообщение об ошибке:

panic: runtime error: index out of range 

goroutine 1 [running]: 
    <store_credit>.FindItemPairs(0x208208000, 0x1e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0) 
<store_credit_location>.go:76 +0x4ac 
main.main() 
    <main_dir>/test_sc.go:16 +0x24d 
exit status 2 

(! соответствующая строка с < отмечено - подкожно выше и < - главные ниже)

Чтобы попробовать отладить, я использовал следующий проект https://github.com/mailgun/godebug для проверки и нашел, что мой код выполнен без проблем.

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

Любое руководство по этому вопросу было бы весьма признателен!

Для больше контекста, вот варенье код, который я пытаюсь выполнить: https://code.google.com/codejam/contest/351101/dashboard#s=p0

Edit: Для еще большего контекста, то здесь основной файл я бегу, что вызывает эту функцию:

func main() { 
    cases, err := store_credit.ReadLines("A-small-practice.in") 
    if err != nil { 
     fmt.Println(err) 
    } 

    fmt.Println(cases) 

    results, err := store_credit.FindItemPairs(cases) //<--!main 
    if err != nil { 
     fmt.Println(err) 
    } 

    for i := 0; i < len(results); i++ { 
     fmt.Println(results[i]) 
    } 
} 

ReadLines отлично работает без проблем.

+0

Это единственный goroutine, к которому можно обратиться к «сценариям» или к любым его предметам во время паники? – captncraig

+0

Вы уверены, что строка 76 отмечена '<-!'? Я ожидал бы, что вне диапазона на линии до или после, но не в строке 'for'. – captncraig

+0

@captncraig Комментарий 1: Я почти уверен, так как я не пытаюсь порождать каких-либо гортанов. Я импортирую этот код и вызываю эту функцию из другого исходного файла (моего основного источника), но моя основная функция не должна обращаться к любой из ее внутренних переменных. Комментарий 2: это строка, о которой мне рассказывают, всякий раз, когда я запускаю ее. Я так же смущен, как ты на этом фронте. – jtgoen

ответ

5

Похоже, что у вас может быть гонка данных где-то. Попробуйте запустить его с флагом -race.

go run -race myfile.go

+0

Итак, добавив этот флаг, он запускается без проблем (например, запускает его в отладчике), но я все еще не уверен, где источник проблемы ... Извините, я новичок в Go, поэтому я все еще изучая, как правильно отлаживать его. Я просмотрел документы -run, и никаких предупреждений, показываемых при работе с -race, нет, похоже, что это работает. – jtgoen