- ベストアンサー
配列を使った2次元配列の操作方法について
- 配列を使用してヒルベルト曲線を2次元配列で表すプログラムがあります。具体的な操作方法について教えてください。
- このプログラムは、ヒルベルト曲線を2次元配列で表現するものです。プログラムの実行結果は、(0 0)から(0 255)までの座標を表示します。
- 質問は、この2次元配列でどのような操作を行えばよいかについてのものです。具体的な操作方法について教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
2次元配列ではなくて構造体の配列の方が扱いやすいかもしれませんね。サンプルはこんな感じです。ヒルベルトの走査はなるべく短く書いてみました。やり方は違いますが同じ座標列になるはずです。 #include <stdio.h> #include <stdlib.h> /* データ用変数 */ struct xy { int x; int y; } *hil; int idx; /* ヒルベルトスキャン */ void hilbert(int n, int p, int x, int y) { if (n>1) { hilbert(n/2, (p+4)%8, x+(p&1)*(n/2), y+((p>>1)&1)*(n/2)); hilbert(n/2, p, x+((((p>>1)^(p>>2)))&1)*(n/2), y+(~(p^(p>>2))&1)*(n/2)); hilbert(n/2, p, x+(~p&1)*(n/2), y+(~(p>>1)&1)*(n/2)); hilbert(n/2, 7-p, x+(~((p>>1)^(p>>2))&1)*(n/2), y+((p^(p>>2))&1)*(n/2)); } else { hil[idx].x=x; hil[idx].y=y; idx++; } } int main(void) { int i,n; /* nの入力と領域確保 */ printf("n? "); scanf("%d",&n); if((hil=malloc(sizeof(struct xy)*(1<<n)*(1<<n)))==NULL) { printf("malloc error\n"); return -1; } /* ヒルベルトスキャン */ idx=0; hilbert((1<<n),4,0,0); /* データ表示 */ for (i=0; i<idx; i++) { printf("%d (%d %d)\n",i,hil[i].x,hil[i].y); } /* 領域開放 */ free(hil); return 0; }
その他の回答 (2)
- JaritenCat
- ベストアンサー率37% (122/322)
>hilbert(n/2, p, x+((((p>>1)^(p>>2)))&1)*(n/2), y+(~(p^(p>>2))&1)*(n/2)); >で関数'hilbert'への引数が少なすぎますとでます後 わかりません。他の場所でタイプミスでしょうか?これだけ見ると引数はちゃんと4個ありますね・・・ >if((hil=malloc(sizeof(struct xy)*(1<<n)*(1<<n)))==NULL) { >で警告:代入より、キャストなしで整数からポインタをつくりましたとでます。 無視しても大丈夫だと思いますが (struct xy*)でキャストしてください。if((hil=(struct xy*)malloc(sizeof(struct xy)*(1<<n)*(1<<n)))==NULL) {
お礼
うまく実行できました。ありがとうございました!!!
補足
コンパイルはできました!実行するとセグメンテーション違反ですとエラーが出てしまいました。
- JaritenCat
- ベストアンサー率37% (122/322)
2次元配列には何が入るのでしょうか。 例えば、int zahyou[][] があったとして、zahyou[x][y]に何番目の座標か入れたい? 配列サイズがnで変わるので2次元配列は無理だと思います。1次元配列ならなんとか。。。 グローバル変数にint cnt=0;とint *zahyou; を定義して、nが確定したところで、zahyou=malloc(sizeof(int)*(1<<n)*(1<<n));で領域確保して、printfの後ろにzahyou[x+(1<<n)*y]=cnt++;とか入れてやれば1次元配列になります。。。 マクロで、 #define hairetu(x,y) *(zahyou+x+y*(1<<n)) ってやれば、hairetu(x,y)=cnt++; という風に2次元配列っぽく書けますが。。
補足
nを10としてやればどうですか? x y 0 (0 0) 1 (0 1) ・ ・ ・ 254 (0 254) 255 (0 255) と表示したいです。
お礼
うまくいきませんでした><。 hilbert(n/2, p, x+((((p>>1)^(p>>2)))&1)*(n/2), y+(~(p^(p>>2))&1)*(n/2)); で関数'hilbert'への引数が少なすぎますとでます後 if((hil=malloc(sizeof(struct xy)*(1<<n)*(1<<n)))==NULL) { で警告:代入より、キャストなしで整数からポインタをつくりましたとでます。 どうしたいいでしょうか?
補足
ありがとうございます。試してみます。