• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列)

配列を使った2次元配列の操作方法について

このQ&Aのポイント
  • 配列を使用してヒルベルト曲線を2次元配列で表すプログラムがあります。具体的な操作方法について教えてください。
  • このプログラムは、ヒルベルト曲線を2次元配列で表現するものです。プログラムの実行結果は、(0 0)から(0 255)までの座標を表示します。
  • 質問は、この2次元配列でどのような操作を行えばよいかについてのものです。具体的な操作方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

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; }

gfgdhggddg
質問者

お礼

うまくいきませんでした><。 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) { で警告:代入より、キャストなしで整数からポインタをつくりましたとでます。 どうしたいいでしょうか?

gfgdhggddg
質問者

補足

ありがとうございます。試してみます。

その他の回答 (2)

回答No.3

>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) {

gfgdhggddg
質問者

お礼

うまく実行できました。ありがとうございました!!!

gfgdhggddg
質問者

補足

コンパイルはできました!実行するとセグメンテーション違反ですとエラーが出てしまいました。

回答No.1

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次元配列っぽく書けますが。。

gfgdhggddg
質問者

補足

nを10としてやればどうですか? x y 0 (0 0) 1 (0 1) ・ ・ ・ 254 (0 254) 255 (0 255) と表示したいです。

関連するQ&A

専門家に質問してみよう