2015-05-01 3 views
0

Цель: Я решал вопрос 6 из книги «Крекинг для интервью по кодированию» с помощью Go.Недопустимая операция: индекс типа * int golang

Примечание Я НЕ wan't ПОМОЩИ ИЛИ РЕШЕНИЕ к этому вопросу

Учитывая изображение, представленное матрицу NxN, где каждый пиксель в изображении 4 байта , написать метод, чтобы повернуть изображение на 90 градусов. Можете ли вы сделать это на месте?

Проблема: Я сделал массив массивов для представления матрицы, и я создал функцию свопинга, чтобы поменять элементы по часовой стрелке в матрице. По некоторым причинам я получаю это действительно странные ошибки при попытке компиляции:

./Q6.go:29: invalid operation: b[N - col - 1] (index of type *int) 
./Q6.go:30: invalid operation: b[N - row - 1] (index of type *int) 

Где я получаю тип * Int как индекс? В представлении Go, len (v) возвращает тип int, а все остальное находится в значении «N-col-1», это тип int, и как я могу получить индекс типа int?

Код:

package main 

import "fmt" 

func main() { 
    b := [][]int{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}} // 4 by 4 array going from 1 to 16 
    N := len(b) 

    for row := 0; row < N/2; row++ { 
     for col := row; col < N - row - 1; col++ { 
      a := &b[row][col] 
      b := &b[col][N - row - 1] 
      c := &b[N - col - 1][col] // <-- Error here 
      d := &b[N - row - 1][N - col - 1] // <-- Error here 
      fourSwap(a, b, c, d) 
     } 
    } 

    for r := range b { 
     for c:= range b[0] { 
      fmt.Print(b[r][c]) 
     } 
     fmt.Print("\n") 
    } 

} 

// [a][-][-][b]  [c][-][-][a] 
// [-][-][-][-] --> [-][-][-][-] 
// [-][-][-][-] --> [-][-][-][-] 
// [c][-][-][d]  [d][-][-][b] 

func fourSwap(a, b, c, d *int) { 
    temp := *b 
    *b = *a 
    *a = *c 
    *c = *d 
    *d = temp 
} 
+1

код объявляет новую переменную 'b' внутри цикла, что тени внешний' b'. Я не уверен, хотите ли вы этого или нет. Я не понимаю, что вы пытаетесь сделать с изображением. – user4752457

+1

BTW, ваш 'fourSwap' можно упростить с помощью многозадачности Go. '* a, * b, * c, * d = * c, * a, * d, * b'. –

+0

Как говорит @tvblah, это из-за затенения 'b'. Самое простое исправление состоит в том, чтобы изменить кусочек срезов с 'b: = [] [] int {' на другое имя. В противном случае сразу после 'b: = & b [x] [y]' у вас есть новый 'b' типа' int' и больше не может его индексировать. –

ответ

2

Вы объявляете b внутри цикла, и что тень вашего кусочка.

for row := 0; row < N/2; row++ { 
    for col := row; col < N - row - 1; col++ { 
     a := &b[row][col] 
     b := &b[col][N - row - 1] <<<< b is now an *int 
     c := &b[N - col - 1][col] // <-- Error here 
     d := &b[N - row - 1][N - col - 1] // <-- Error here 
     fourSwap(a, b, c, d) 
    } 
} 
+1

Мой мозг .... Hurts .... Спасибо всем 3 из вас, кто прокомментировал. –

+1

Мы все были там, удачи с Go! – OneOfOne

1

Вы создаете новую локальную переменную Ь, которая является указателем на строку, прежде чем вы получите сообщение об ошибке:

b := &b[col][N - row - 1] 
Смежные вопросы