2016-08-14 15 views
-1

this is the error description im getting, i cant really understand what is the problemこのプログラムでは、ナイトの動きに応じてチェスボード上の任意の2つの四角形間の最短経路を計算しようとしています。長さの中で、私は静かに仕事をする方法を理解しています。私は "パニック:範囲外のインデックス"というエラーに遭遇しています。 pleaseパニック:Golangの範囲外のインデックスのエラー

package main 

import (
    "bufio" 
    "fmt" 
    "os" 
    "sort" 
    "strings" 
) 

var heightcurrstack int 
var currentSource string 
var currentDest string 
var currentDestn int 
var PosMoves [8]int 

func main() { 

    file, err := os.Open("chessin.txt") 
    if err != nil { 
     fmt.Println(err) 
    } 
    defer file.Close() 
    scanner := bufio.NewScanner(file) 
    for scanner.Scan() { 
     strs := strings.Split(scanner.Text(), ",") 

     currentSource = strs[0] 
     currentDest = strs[1] 
     IsValid(currentSource) 
     toNumber(currentSource) 
     IsValid(currentDest) 
     currentDestn = toNumber(currentDest) 
    } 

} 
func IsValid(b string) bool { 

    if b[0] <= 'H' && b[0] >= 'A' && b[1] <= '8' && b[1] >= '1' { 
     return true 
    } 
    return false 
} 

func toNumber(s string) int { 
    var Number int 

    if len(s) != 2 { 
     fmt.Println("Invalid Input", s, ".") 
    } 
    Number = int(s[0]-'A')*8 + int(s[1]-'0') 
    return Number 
} 

func ToString(n int) string { 
    n-- 
    return string((n/8)+65) + string((n%8)+49) 

} 

func PossibleMoves(n int) [8]int { 

    a := ToString(n) 
    isval := IsValid(a) 

    if isval == true { 
     if IsValid(string(a[0]+1) + string(a[1]+2)) { 
      PosMoves[0] = toNumber(string(a[0]+1) + string(a[1]+2)) 
     } 
     if IsValid(string(a[0]+1) + string(a[1]-2)) { 
      PosMoves[1] = toNumber(string(a[0]+1) + string(a[1]-2)) 
     } 
     if IsValid(string(a[0]-1) + string(a[1]+2)) { 
      PosMoves[2] = toNumber(string(a[0]-1) + string(a[1]+2)) 
     } 
     if IsValid(string(a[0]-1) + string(a[1]-2)) { 
      PosMoves[3] = toNumber(string(a[0]-1) + string(a[1]-2)) 
     } 
     if IsValid(string(a[0]+2) + string(a[1]+1)) { 
      PosMoves[4] = toNumber(string(a[0]+2) + string(a[1]+1)) 
     } 
     if IsValid(string(a[0]+2) + string(a[1]-1)) { 
      PosMoves[5] = toNumber(string(a[0]+2) + string(a[1]-1)) 
     } 
     if IsValid(string(a[0]-2) + string(a[1]+1)) { 
      PosMoves[6] = toNumber(string(a[0]-2) + string(a[1]+1)) 
     } 
     if IsValid(string(a[0]-2) + string(a[1]-1)) { 
      PosMoves[7] = toNumber(string(a[0]-2) + string(a[1]-1)) 
     } 
    } 

    sort.Sort(sort.Reverse(sort.IntSlice(PosMoves[0:8]))) 
    return PosMoves 
} 
var visithistory [64]bool 

func IsvisitedNode(currentSource int) bool { 


    visithistory[currentSource] = true 

    if visithistory[currentSource] == true { 

     return false 

    } 
    return true 


} 

type stack []int 

func (s stack) Push(currentSource int) stack { 
    return append(s, currentSource) 
} 

func (s stack) Pop() ([]int) { 
    heightcurrstack := len(s) 

    return s[0:heightcurrstack] 
} 

func dfstraversal(currentSource int) { 

    var currentchildren [8]int 
    copy(PosMoves[:], currentchildren[:]) 
    s := make(stack, 0) 

    if IsvisitedNode(currentSource) == true { 

     var j int = 0 
     for j < len(currentchildren) { 
      currentchildren[j+1] = currentSource 
     } 
} else if IsvisitedNode(currentSource) == false { //condition 1:previously not visited 
     if heightcurrstack > 6 { //condition 2: if the number of moves are more than 6 
      tracesuccessfulpath() 
     } 

     if currentSource == currentDestn { //condition 3 : if the destination posititon is found 
      tracesuccessfulpath() 
     } 
     s = s.Push(currentSource) 

     s = s.Push(currentchildren[0]) 

     currentchildren[0] = currentSource 

     if currentSource == currentDestn { 
      tracesuccessfulpath() 
     } 

    } 

    PossibleMoves(currentSource) 
    dfstraversal(currentSource) 

} 

func tracesuccessfulpath() { 


    s := make(stack, 0) 
    s.Pop() 


var Path []string 

for _,x := range s { 
    Path := append(Path, ToString(x)) 

fmt.Println(Path) 
} 

} 
+3

あなたと同じくらいあなたを助けることができます。デバッガを使い始めると、どこに問題があるのか​​がわかります; o) – lofcek

+2

デバッガがなくても、パニックにつながる正確な行とスタックトレースが出力に表示されます。 – JimB

+0

@JimB私もエラーを投稿した、私は理解できない何がコードの問題です – Riya

答えて

1

"toNumber(s string)"関数に0または1の文字列を渡しています。それがなぜパニックになっているのですか?

これは、chessin.txtに適切な情報がないために発生した可能性があります。あなたはそれを分割するときstrs := strings.Split(scanner.Text(), ",")はあなたが期待しているものを見つけることができません

関連する問題