2016-04-26 23 views
1

問題

我有一個分配給寫球拍函數:球拍數據處理問題:向量指針是空

需要起點,目的地(既作爲3個字符的機場代碼), 和航班數據列表,並返回從起點到終點的所有航班的遲到統計信息的列表 ,並將單元格(來源目的地)作爲第一個元素。

數據必須格式化爲六個比例,比例至少爲1,15,30,60,120和180分鐘的航班比例。

在我的代碼中,我寫了一個尾先遞歸函數,每當找到匹配的飛行數據片段時,它就會在一個長度爲6的矢量中增加一個值。然後,一旦遞歸檢查數據列表,就會返回比例列表。

我收到以下錯誤,表明part在達到增量代碼時無效。 part不應該指向整個函數中生成的向量嗎?

錯誤

vector-ref: contract violation 
    expected: vector? 
    given: #<void> 
    argument position: 1st 
    other arguments...: 3 

代碼

(require "ontime.rkt") 

(define (ontime-stats-by-route orig dest data) 
    (define (aux orig dest data part) 
    (if (null? data) 
     (let ([sum (foldl + 0 (vector->list part))]) 
      (list (cons orig dest) 
       (/ (vector-ref part 0) sum) 
       (/ (vector-ref part 1) sum) 
       (/ (vector-ref part 2) sum) 
       (/ (vector-ref part 3) sum) 
       (/ (vector-ref part 4) sum) 
       (/ (vector-ref part 5) sum))) 
     (if (and 
      (eq? orig (car (car (cdr (car data))))) 
      (eq? dest (car (cdr (car (cdr (car data))))))) 
      (let ([late (car (cdr (cdr (cdr (car data)))))]) 
       (cond 
       [(>= late 180) (aux orig dest (cdr data) 
            (vector-set! part 5 (vector-ref part 5)))] 
       [(>= late 120) (aux orig dest (cdr data) 
            (vector-set! part 4 (vector-ref part 4)))] 
       [(>= late 60) (aux orig dest (cdr data) 
            (vector-set! part 3 (vector-ref part 3)))] 
       [(>= late 30) (aux orig dest (cdr data) 
            (vector-set! part 2 (vector-ref part 2)))] 
       [(>= late 15) (aux orig dest (cdr data) 
            (vector-set! part 1 (vector-ref part 1)))] 
       [(>= late 1) (aux orig dest (cdr data) 
            (vector-set! part 0 (vector-ref part 0)))] 
       [else (aux orig dest (cdr data) part)])) 
      (aux orig dest (cdr data) part)))) 
    (let ([count (make-vector 6 0)]) 
    (aux orig dest data count))) 

(ontime-stats-by-route "BWI" "BDL" ontime) 
+1

在球拍'#'不是空指針,它通常不以任何方式用於可爲空的值。它通常來自程序,不會返回任何有用的值,通常是因爲它們有副作用。 –

回答

3

的問題是,突變基因的功能,如vector-set!set-box!,等返回#<void>,因爲他們已經習慣了他們的突變,而不是他們的返回值。這很好,因爲它鼓勵在清晰的功能代碼(你可以操縱和重新排序,但是你想要)和明確的命令代碼(你必須更加小心)之間進行一些分離。這也是爲什麼這些功能通常以!結束的原因。的

因此,而不是在通過(vector-set! part ....)作爲新part的說法,你應該單獨做這種突變,再通過part本身,而不是因爲它現在突變的說法:

  (cond 
      [(>= late 180) 
      (vector-set! part 5 (vector-ref part 5)) 
      (aux orig dest (cdr data) part)] 
      [(>= late 120) 
      (vector-set! part 4 (vector-ref part 4)) 
      (aux orig dest (cdr data) part)] 
      [(>= late 60) 
      (vector-set! part 3 (vector-ref part 3)) 
      (aux orig dest (cdr data) part)] 
      [(>= late 30) 
      (vector-set! part 2 (vector-ref part 2)) 
      (aux orig dest (cdr data) part)] 
      [(>= late 15) 
      (vector-set! part 1 (vector-ref part 1)) 
      (aux orig dest (cdr data) part)] 
      [(>= late 1) 
      (vector-set! part 0 (vector-ref part 0)) 
      (aux orig dest (cdr data) part)] 
      [else 
      (aux orig dest (cdr data) part)]) 

雖然,像(vector-set! part 5 (vector-ref part 5)) AREN根本不會改變指數5的價值。你的意思是(vector-set! part 5 (add1 (vector-ref part 5))),因爲你說你想增加值?

  (cond 
      [(>= late 180) 
      (vector-set! part 5 (add1 (vector-ref part 5))) 
      (aux orig dest (cdr data) part)] 
      [(>= late 120) 
      (vector-set! part 4 (add1 (vector-ref part 4))) 
      (aux orig dest (cdr data) part)] 
      [(>= late 60) 
      (vector-set! part 3 (add1 (vector-ref part 3))) 
      (aux orig dest (cdr data) part)] 
      [(>= late 30) 
      (vector-set! part 2 (add1 (vector-ref part 2))) 
      (aux orig dest (cdr data) part)] 
      [(>= late 15) 
      (vector-set! part 1 (add1 (vector-ref part 1))) 
      (aux orig dest (cdr data) part)] 
      [(>= late 1) 
      (vector-set! part 0 (add1 (vector-ref part 0))) 
      (aux orig dest (cdr data) part)] 
      [else 
      (aux orig dest (cdr data) part)])