2017-03-31 4 views
0

나는 내가 규범에 의해 나눌 수있는 벡터의 각 요소 (다른 조건의 정수)를 설정하려고 벡터 설정벡터 - 세트 구현을 사용하여 나의 구성표에 어떤 문제가 있습니까?

(define foo0 
    (lambda (vec) 
    (let* ((newvec (vector vec)) 
      (l  (vector-length vec)) 
      (norm (norm0 vec))) 
     (do ((i 0(+ i 1))) 
     ((= i l)) 
     (vector-set*! newvec i (/(vector-ref vec i) norm))) newvec))) 

로 잘못 여기서 뭐하는 거지 궁금 해서요.

내가 점점 계속 오류가 그래서 최초의 솔루션을 발견하고

vector-set!: index is out of range 
    index: 1 
    valid range: [0, 0] 
    vector: '#(3/4) 

이다, 그러나, newvec는 크기 1로 재설정하기 때문에 인덱스가 범위를 벗어나됩니다.

+0

코드 형식이 매우 이상합니다. 무엇이 잘못 되었습니까? –

+0

@RainerJoswig 내 첫 번째 게시물이었습니다. 사과드립니다. – Felix

답변

1

vector 따라서, 인자로 주어진 요소를 변경 가능한 벡터를 만든다 :

(vector 4)  ; a vector of one element 
(vector 1 2 3) ; a vector of 3 elements 

그래서 당신은 당신이 돌연변이로 작업하려고 20 요소 벡터 필요하다고 할 수 있습니다. vector을 사용하면 20 개의 가짜 인수가 있어야하기 때문에 문제가되지 않습니다. 당신은 당신이 make-vector에 그것을 전달할 수 vector-length에 전달 된 벡터의 길이를 얻을 수있는 지식을 가진 자

(make-vector 20 0) 
; ==> #(0 0 ... 0), a vector of 20 elements, all 0 

대신 당신이 make-vector를 사용 그것은 두 개의 인수, 크기와 모든 요소에 대한 선택적인 초기 값을 취 값을 복사하여 얕은 사본을 만들 수있는 동일한 크기의 벡터를 만들 수 있습니다. 그러나 사용하면 훨씬 쉽게 할 수 있습니다. vector-copy

+0

벡터와 목록의 차이점은 무엇입니까? – naomik

+0

@naomik 벡터는 일반적으로 다른 언어의 배열이라고하며 일반적으로 고정 길이 O (1) 액세스이며 목록은 단일 링크 목록입니다. Common Lisp은 벡터와 배열을 모두 가지고 있으며, 차이점은 배열이 동적 인 크기와 다중 차원이 될 수 있다는 것입니다. – Sylwester

+0

음 hai! 그건 의미가 있습니다. 고마워요 ^^ – naomik

1

프로그램의 두 번째 줄에는 (vector vec)으로 작성됩니다. 이것은 무엇을 평가합니까?