2013-05-01 1 views
0

Я начинающий программист. Я должен написать простую программу в чистом схеме, которая выведет прямоугольник заданной высоты и ширины (например, 4,6):Вектор изменения вектора векторов

111111 
100001 
100001 
111111 

1 представляет собой черную границу, 0 пустое пространство.

Я столкнулся с препятствием. Мое решение - вектор векторов #(#(111111) (100001) (100001) (100001)), потому что его легко изменить позже. Сначала я создаю вектор векторов, заполненных нулями, и позже я хочу установить его значения равными 1.

Проблема в том, что, например, если я хочу изменить первый элемент первого вектора на 1, я не знаю, почему набор программ первые элементы всех векторов к 1. Так что я хочу получить: : #(100000) (000000) (000000) (000000)) но я получаю #(#(100000) (100000) (100000) (100000))

код:

(vector-set! (vector-ref vect 0) 0 "1") 

кто-нибудь есть explenation на возможно более простое решение?

ответ

1

Это позволит избежать aliasing проблемы:

(define (make-board n) 
    (let ((table (make-vector n))) 
    (let filling ((i 0)) 
     (if (= i n) 
      table 
      (begin (vector-set! table i (make-vector n 0)) 
       (filling (+ i 1))))))) 
1

Wild догадка, вы построили 2-D вектор так:

(define row #(0 0 0 0 0 0)) 
(define table (vector row row row row)) 

Тогда что у вас есть вектор, называемый table, который содержит четыре ссылки на row, а то, что вам нужно составляет четыре копий от row, которые могут быть независимо изменены. Вы можете получить, что с

(define table (vector (vector-copy row) 
         (vector-copy row) 
         (vector-copy row) 
         (vector-copy row))) 

(С технической точки зрения, ваши векторы обмена структура. Часто, это хорошая вещь, но когда вы используете разрушительную модификацию, например vector-set!, это может привести к удивительным результаты.)

+0

к сожалению, я должен был пост об этом раньше: я создаю его: '(определение vect (make-vector h (make-vector w 0))) В этом проблема? – maciek

+0

@ MaciekBąk: да, точно такая же ситуация. Вы создаете один вектор размера 'w', тогда вы передаете ссылку на это на внешний' make-vector', который просто повторяет ссылку вместо копирования вектора. –

+0

OK Я понимаю. Однако я не могу использовать векторную копию или любые другие дополнительные библиотеки. Есть ли простой способ построить 2D-вектор h-высоты и w-ширины, чтобы все строки были отдельными? – maciek