• ベストアンサー

3次元配列から2次元配列への代入

C言語初心者です。 詳しい方、宜しくお願い致します。 下記のような三次元配列(Sanjigen[2][5][5])があります。 ダンプしたもので見難くてすみません。 00FFBCBC [0][0][0] 01 02 03 04 05 00FFBCC1 [0][1][0] 06 07 08 09 10 00FFBCC6 [0][2][0] 11 12 13 14 15 00FFBCCB [0][3][0] 16 17 18 19 20 00FFBCD0 [0][4][0] 21 22 23 24 25 00FFBCE4 [1][0][0] 26 27 28 29 30 00FFBCE9 [1][1][0] 31 32 33 34 35 00FFBCEE [1][2][0] 36 37 38 39 40 00FFBCF3 [1][3][0] 41 42 43 44 45 00FFBCF8 [1][4][0] 46 47 48 49 50 このデータ(Sanjigen[2][5][5])を、二次元配列にしまう方法をご教授ください。 Nijigen1[5][5]には三次元配列のデータ(1~25)と(26~50)をアンドしたデータを格納します。 Nijigen2[5][5]には三次元配列のデータ(1~25)と(26~50)をオアしたデータを格納します。 下記は自分の作ったプログラムですが、うまくいきません。 char Sanjigen[2][5][5]; char Nijigen1[5][5]; char Nijigen2[5][5]; void get_data( void ) { char i; for( i=0; i<8; ++i ){ Nijigen1[i] = Sanjigen[0][i] & Sanjigen[1][i]; Nijigen2[i] = Sanjigen[0][i] ^ Sanjigen[1][i]; } } 説明わかりにくくて申し訳ありません。 宜しくお願い致します。

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

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

>同じような処理を何回もしなければいけないので、できれば1つのループにしたいんです。 配列が「ダンプした通りのメモリ配置」になっているとの保証があるなら、以下のようにすればよい。 char Sanjigen[2][5][5]; char Nijigen1[5][5]; char Nijigen2[5][5]; void get_data( void ) { int i; char *p1 = &Sanjigen[0][0][0]; char *p2 = &Sanjigen[1][0][0]; char *p3 = &Nijigen1[0][0]; char *p4 = &Nijigen2[0][0]; for(i=0;i < 5 * 5; ++i,p1++,p2++,p3++,p4++ ){ *p3 = *p1 & *p2; *p4 = *p1 | *p2; } } もし「ダンプした通りのメモリ配置」になってないなら、正しく動く保証はない。

dora40
質問者

お礼

解決しました。 非常に参考になりました。 ありがとうございました^^

その他の回答 (5)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.6

>ソースをシンプルに、より見やすくしたいというのと、 >無駄を省きたいということです。 2重ループのほうが、よっぽどシンプルで見やすくて無駄がないと思いますが。 >1行が2行になるのは気にならないですが、100行が200行になるのはなんとなく嫌なんです。 100行が200行になったりしませんよ。 #2さんの例でも、4行が6行になるだけですが。

dora40
質問者

補足

4行が6行になると、同じような処理を100回やらなければならない場合、200行ふえますよね。そういう意味です。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

> 同じような処理を何回もしなければいけないので、 ループを1重にする理由になっていないと思うのですが。。。 配列の添え字を計算するのは予想以上にコストがかかります、 No2さんの回答がベストだと思いますが他に1重ループにしたい 理由があるのでしょうか?

dora40
質問者

お礼

ありがとうございました^^

dora40
質問者

補足

>ループを1重にする理由になっていないと思うのですが。。。 ソースをシンプルに、より見やすくしたいというのと、 無駄を省きたいということです。 1行が2行になるのは気にならないですが、100行が200行になるのはなんとなく嫌なんです。 >配列の添え字を計算するのは予想以上にコストがかかります、 コストとはどういう意味でしょうか? 処理時間という意味でしょうか?

  • os6v100i
  • ベストアンサー率44% (16/36)
回答No.3

あ、ちょっと勘違い・・・^^; 1重ループで処理する場合、さらに注意点があります でも、具体的にはご自分で調べてみてください^^;

  • os6v100i
  • ベストアンサー率44% (16/36)
回答No.2

ようは、Sanjigen[0]とSanjigen[1]をそれぞれANDもしくはORをとった値をNijigen1、Nijigen2にいれればいいんですよね? 素直にループで回せばいいのでは? int i,j; for (i = 0;i < 5;i++) {   for (j = 0; j < 5;j++) {     Nijigen1[i][j] = Sanjigen[0][i][j] & Sanjigen[1][i][j];     Nijigen2[i][j] = Sanjigen[0][i][j] | Sanjigen[1][i][j];   } } まぁ、簡単な解決は以上だと思うんですが、こういう場合どういうふうにうまくいかないのかを書くと回答しやすいです。 (それが解ればそもそも質問しないかな?) 質問者さんのやり方(一つのループですます)の場合、ループの回数とカウンタiの増加のさせ方に問題があるんじゃないかと。 あと、^はORじゃなくXORです。ORは|だったかと。

dora40
質問者

お礼

解決しました。 非常に参考になりました。 ありがとうございました^^

dora40
質問者

補足

ご解答ありがとうございます^^ 説明不足ですみません。 同じような処理を何回もしなければいけないので、できれば1つのループにしたいんです。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>char Sanjigen[2][5][5]; >char Nijigen1[5][5]; >char Nijigen2[5][5]; この配列定義に対して、 >for( i=0; i<8; ++i ){ ループが一重なのはなぜですか?また、8という数値はどこから来ましたか?

dora40
質問者

お礼

ありがとうございました^^

dora40
質問者

補足

すみません。 8は5の間違いです^^;

関連するQ&A