6

特定のスライスで合計が特定の合計になる 2 つの整数を見つけるために、次のコードを使用しています。

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

(関連する行は、上に <--!sc 、下に <--!main で示されています)

デバッグを試みるために、次のプロジェクトhttps://github.com/mailgun/godebugを使用してテストしたところ、コードが問題なく実行されることがわかりました。

現在、範囲外の値にアクセスする方法はわかりませんが、これをさらにデバッグする方法がわかりません...

これに関するガイダンスをいただければ幸いです。

詳細については、実装しようとしているコードジャムを次に示します: https://code.google.com/codejam/contest/351101/dashboard#s=p0

編集:さらにコンテキストについては、この関数を呼び出す実行中のメインファイルを次に示します。

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 は問題なく正常に動作します。

4

1 に答える 1

6

どこかでデータ競合が発生しているようです。-race フラグを付けて実行してみてください。

go run -race myfile.go

于 2015-07-29T04:53:30.957 に答える