Gauche:2次元配列のプログラムの移植

Gauche:2次元配列のプログラムの移植

2次元配列のプログラムの移植

<元ソース>

#include <stdio.h>
#define MW 10
#define MH 10
int mdata[MH][MW];
int main(void) {
    int x, y;
    for (y = 0; y < MH; y++) {
        for (x = 0; x < MW; x++) {
            mdata[y][x] = y * MW + x;
            printf("%2d ", mdata[y][x]);
            if (x == MW - 1) printf("\n");
        }
    }
    return 0;
}

<移植後>

(define mw 10)
(define mh 10)
(define mdata (make-vector (* mw mh) 0))
(define (pt x y) (+ (* y mw) x))
(let loop ((x 0) (y 0))
  (set! (~ mdata (pt x y)) (+ (* y mw) x))
  (display (format "~2d " (~ mdata (pt x y))))
  (if (= x (- mw 1)) (newline))
  (cond
   ((< x (- mw 1)) (loop (+ x 1) y))
   ((< y (- mh 1)) (loop 0 (+ y 1)))))

hamayama(2017/08/12 10:19:04 UTC)(2017/08/13 04:02:16 UTC)
(2017/08/15 13:10:02 UTC)

array を使った場合 (齊藤 2017/11/15 17:48:54 UTC)

一次元のベクタを使ったのには相応の理由があるのでしょうが、あえて array を使った場合を考えてみるとこんな感じになりますね。

(use gauche.array)

(define mw 10)
(define mh 10)

(define mdata
  (tabulate-array (shape 0 mh 0 mw) (^(y x) (+ (* y mw) x))))

(array-for-each-index mdata
                      (^(y x)(format #t "~2d " (array-ref mdata y x))
                        (when (= x (- mw 1)) (newline))))

内部的にはベクタに色々とかぶせる形で実装されているので、必要であればベクタとして取り出すことも出来るようです。

(~ mdata 'backing-storage)

ドキュメントに書かれていないやり方なので非公式扱いだとは思いますが。


最終更新 : 2018/08/14 12:43:06 UTC