2015-07-29 9 views
5

Mam następujący kod używany do znalezienia dwóch liczb całkowitych, że suma do danej sumy w danym wycinka:Golang indeks poza zasięgiem tylko po uruchomieniu dzieje się poza debugger

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 
} 

jednak, gdy próbuję uruchomić mój kod, aby znaleźć punkt pary, pojawia się następujący błąd:

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 

(! istotne linia jest oznaczona < - sC powyżej < - główny poniżej)

Aby spróbować debugować, użyłem następującego projektu https://github.com/mailgun/godebug do przetestowania i stwierdziłem, że mój kod został wykonany bez problemu.

Obecnie mam pojęcia jak będę dostępem wartość, która jest poza zasięgiem, ale nie mam pojęcia jak to będzie debugować dalej ...

Wszelkie wskazówki w tej sprawie byłoby bardzo mile widziane!

Więcej kontekście, tutaj jest dżem kod próbuję wdrożyć: https://code.google.com/codejam/contest/351101/dashboard#s=p0

Edit: Dla jeszcze większej kontekście, tu jest główny plik używam, który wywołuje tę funkcję:

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 działa poprawnie bez żadnych problemów.

+0

Czy jest to jedyna goroutyna, która może uzyskać dostęp do "scenariuszy" lub jakiejkolwiek z jego pozycji w czasie paniki? – captncraig

+0

Czy na pewno linia 76 jest oznaczona '<-!'? Spodziewam się, że będzie poza zakresem na linii przed lub po, ale nie na linii 'for'. – captncraig

+0

@captncraig Komentarz 1: Jestem prawie pewny, ponieważ nie próbuję odrodzić żadnych goroutines. Importuję ten kod i wywołuję tę funkcję z innego pliku źródłowego (moje główne źródło), ale moja główna funkcja nie powinna mieć dostępu do żadnej z jej wewnętrznych zmiennych. Komentarz 2: to linia, o której mi mówi, ilekroć ją uruchomię. Jestem tak zdezorientowany, jak ty na tym froncie. – jtgoen

Odpowiedz

5

Wygląda na to, że możesz mieć gdzieś wyścig danych. Spróbuj uruchomić go z flagą -race.

go run -race myfile.go

+0

Okay, więc dodanie tej flagi pozwala jej działać bez problemów (np. Uruchamiając ją w debugerze), ale nadal nie jestem pewien, gdzie jest źródło problemu ... Przepraszam, jestem nowy w Go, więc jestem wciąż ucząc się, jak poprawnie to debugować. Zajrzałem do dokumentacji -run i nie ma ostrzeżeń wyświetlanych, gdy uruchamiam z -race, to po prostu działa. – jtgoen

Powiązane problemy