Article View: fj.lang.c
Article #728Re: [SUMMARY] dynamic memory allocation for 3d array
From: Masao Seki
Date: Sun, 15 Feb 1998 00:00
Date: Sun, 15 Feb 1998 00:00
69 lines
3155 bytes
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-mailReferences:
<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