2015-07-29 6 views
5

läuft Ich habe den folgenden Code verwendet, um zwei Zahlen zu finden, die Summe zu einem bestimmten Summe in einer gegebenen Scheibe:Golang Panik: Laufzeitfehler: Index nur außerhalb des Bereichs, wenn geschieht außerhalb 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 
} 

jedoch, wenn ich versuche, meinen Code ausführen, um die Begriffspaare zu finden, die ich die folgende Fehlermeldung erhalten:

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 

(! entsprechende Zeile mit < bemerkt - sC oben und < - Haupt unten)

Um zu debuggen, habe ich das folgende Projekt https://github.com/mailgun/godebug zum Testen verwendet und festgestellt, dass mein Code ohne Fehler ausgeführt wurde.

Im Moment habe ich keine Ahnung, wie ich würde einen Wert zugreifen, die out-of-Bereich liegt, haben aber keine Ahnung, wie ich das weiter debuggen wird ...

Jede mögliche Anleitung hierzu wäre sehr dankbar!

Weitere Zusammenhang hier ist der Code Jam Ich versuche zu implementieren: https://code.google.com/codejam/contest/351101/dashboard#s=p0

Edit: Noch mehr Kontext, hier ist die Hauptdatei bei mir läuft, die diese Funktion aufruft:

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 funktioniert problemlos ohne Probleme.

+0

Ist dies die einzige Goroutine, die auf Szenarios zugreifen kann, oder eines seiner Elemente zur Zeit der Panik? – captncraig

+0

Sind Sie sicher, dass Zeile 76 mit '<-!' Markiert ist? Ich würde erwarten, dass ein Bereich außerhalb oder außerhalb der Linie vor oder nach der Linie liegt, aber nicht die "for" Linie. – captncraig

+0

@captncraig Kommentar 1: Ich bin ziemlich sicher, da ich nicht versuche, irgendwelche Goroutines zu spawnen. Ich importiere diesen Code und rufe diese Funktion aus einer anderen Quelldatei (meiner Hauptquelle) auf, aber meine Hauptfunktion sollte nicht auf eine ihrer internen Variablen zugreifen. Kommentar 2: Das ist die Zeile, die es mir erzählt, wenn ich es benutze. Ich bin genauso verwirrt wie du an dieser Front. – jtgoen

Antwort

5

Es scheint, dass Sie irgendwo ein Datenrennen haben können. Versuche es mit der -race-Flagge.

go run -race myfile.go

+0

Okay, das Hinzufügen dieses Flags lässt es ohne Probleme laufen (wie im Debugger), aber ich bin mir immer noch nicht sicher, wo die Ursache des Problems liegt ... Sorry, ich bin neu in Go, also bin ich immer noch lernen, wie man es richtig debuggt. Ich habe mir die -run-Dokumente angeschaut und es werden keine Warnungen angezeigt, wenn ich mit -race laufe, es scheint einfach zu funktionieren. – jtgoen

Verwandte Themen