2016-04-18 2 views
1

マイコード:goプログラミングの対角の違いを調べるには?

package main 

import "fmt" 

func main() { 
    var n int 
    fmt.Scan(&n) 
    s := make([][]int, n) 
    for i := 0; i < n; i++ { 
     for j := 0; j < n; j++ { 
      fmt.Scanf("%d %d", &s[i][j]) 
     } 
    } 
    s1 := 0 
    s2 := 0 
    for i := 0; i < n; i++ { 
     for j := 0; j < n; j++ { 
      if i == j { 
       s1 += s[i][j] 
      } 
      if i+j == n-1 { 
       s2 += s[i][j] 
      } 
     } 
     fmt.Println(s1 - s2) 
    } 
} 

出力:

panic: runtime error: index out of range 

私が試みたが、パニックを取得します。私はこの問題の適切な解決方法を知りたい。

答えて

1

この行は:

s := make([][]int, n) 

スライス、その要素タイプ[]intであるスライスのスライスを作成します。 n要素のスライスが作成されますが、外側スライスの要素は要素型のゼロ値で初期化され、[]intのゼロ値はnil(すべてのスライスタイプと同様)です。

あなたは(それらは非nilスライスに初期化されていないので)、外スライスsのいずれかの要素がゼロの長さを持っているのでindex out of rangeパニックを取得し、そのいずれかのj値のs[i][j]パニック。

あなたは「内側」のスライスに要素を割り当てる場合、あなたはまた、それらを初期化する必要があります。

for i := 0; i < n; i++ { 
    s[i] = make([]int, n) // YOU ARE MISSING THIS LINE 
    for j := 0; j < n; j++ { 
     fmt.Scanf("%d %d", &s[i][j]) 
    } 
} 
関連する問題