🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.c
Article #728

Re: [SUMMARY] dynamic memory allocation for 3d array

#728
From: Masao Seki
Date: Sun, 15 Feb 1998 00:00
69 lines
3155 bytes
関@富士ゼロックス at 自宅です。

Tomohiko Sakamoto wrote:
> それから、ポインタ配列と、オブジェクトの配列の実体とを別々にとらずに
> 一つの malloc でとれば、free が共通に使えますよ。

どうせ、実体の違いによりポインタのサイズも内部構造も変わる事がない前提
でコーディングしているのだから、それを徹底的に利用する訳ですね。freeが
共通に使える事にはあまり魅力を感じませんが、mallocが一回で済んで、失敗
時の処理がすっきりするのは、非常に良いですね。こういう柔軟な発想には
脱帽するしかありません。

> void *tensor(int size, int ht, int wh, int dh)
> {
>     int ht_wh = ht * wh;
>     int i = ht + ht_wh + 1 & ~1;

「+ 1 & ~1」は、double word 境界についての配慮と理解して良いですね。

>     t[ht] = (char *)(t + i);
>     for (i = 1; i < ht_wh; i++)
>         t[ht + i] = t[ht + i - 1] + dh;
>     wh *= sizeof(void *);
>     t[0] = (char *)(t + ht);
>     for (i = 1; i < ht; i++)
>         t[i] = t[i - 1] + wh;

各レベルのポインタデータとその中身の対応をテーブルにしてみるまで、
これで3次元配列の構造が実現できている事が納得できませんでした。
うまいものです。
#しばらく、Cプログラムの自作から離れているうちに、随分感覚がにぶり
#なにより頭が固くなったようです。(歳のせいとは思いたくない。)

でも、私としては、3回の間接参照と(コンパイラが仕込む)1回のアドレス
演算を経てdoubleの実体に辿り着くという「double ***t」のデータ構造を
忠実に反映したコーディングの方が好みです。その方が、デバッグが楽だし
4、5次元配列への発展や色々なバリエーションの可能性が豊富だと思うの
ですが如何でしょう。

皆さんには余り興味がないかも知れませんが、「ポインタ配列と、オブジェ
クトの配列の実体とを」一緒に採るというアイデアだけ拝借させて頂いた
私好みのコーディングをご披露してレスを終えます。

void *malloc3D(int size, int dd, int hh, int ww)
{
    int k, m;
    int np = dd + dd * hh + 1 & ~1;
    char ***p3 = malloc(np * sizeof(char *) + dd * hh * ww * size);

    if (p3 == NULL) return NULL;

    p3[0] = (char **)(p3 + dd); /* malloc(dd*hh*sizeof(char *)) */
    p3[0][0] = (char *)(p3 + np); /* calloc(dd*hh*ww, size) */
    memset(p3[0][0], 0, dd * hh * ww * size);

    for (k=0; k < dd; k++) {
	if (k > 0) {
	    p3[k] = p3[k-1] + hh;
	    p3[k][0] = p3[k-1][hh-1] + ww * size;
	}
	for (m=1; m < hh; m++) p3[k][m] = p3[k][m-1] + ww * size;
    }

    return p3;
}

--
関@富士ゼロックス <masao.seki@fujixerox.co.jp>
Technical Details
Message-ID: <34E6E24C.77D9@gb3.so-net.or.jp>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <6c09ra$9hq@www.tuat.ac.jp> <6c1b6n$5j1@csdnews.sm.sony.co.jp>

Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS
X-Google-Thread: 106434,b31663a48df53421
X-Google-Attributes: gid106434,public
From: Masao Seki <ma-seki@gb3.so-net.or.jp>
Subject: Re: [SUMMARY] dynamic memory allocation for 3d array
Date: 1998/02/15
Message-ID: <34E6E24C.77D9@gb3.so-net.or.jp>
X-Deja-AN: 325254367
Content-Transfer-Encoding: 7bit
References: <6c09ra$9hq@www.tuat.ac.jp> <6c1b6n$5j1@csdnews.sm.sony.co.jp>
Content-Type: text/plain; charset=iso-2022-jp
Organization: So-net
Mime-Version: 1.0
Reply-To: ma-seki@gb3.so-net.or.jp
Newsgroups: fj.lang.c