- ベストアンサー
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]; } } 説明わかりにくくて申し訳ありません。 宜しくお願い致します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>同じような処理を何回もしなければいけないので、できれば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; } } もし「ダンプした通りのメモリ配置」になってないなら、正しく動く保証はない。
その他の回答 (5)
- titokani
- ベストアンサー率19% (341/1726)
>ソースをシンプルに、より見やすくしたいというのと、 >無駄を省きたいということです。 2重ループのほうが、よっぽどシンプルで見やすくて無駄がないと思いますが。 >1行が2行になるのは気にならないですが、100行が200行になるのはなんとなく嫌なんです。 100行が200行になったりしませんよ。 #2さんの例でも、4行が6行になるだけですが。
補足
4行が6行になると、同じような処理を100回やらなければならない場合、200行ふえますよね。そういう意味です。
- aris-wiz
- ベストアンサー率38% (96/252)
> 同じような処理を何回もしなければいけないので、 ループを1重にする理由になっていないと思うのですが。。。 配列の添え字を計算するのは予想以上にコストがかかります、 No2さんの回答がベストだと思いますが他に1重ループにしたい 理由があるのでしょうか?
お礼
ありがとうございました^^
補足
>ループを1重にする理由になっていないと思うのですが。。。 ソースをシンプルに、より見やすくしたいというのと、 無駄を省きたいということです。 1行が2行になるのは気にならないですが、100行が200行になるのはなんとなく嫌なんです。 >配列の添え字を計算するのは予想以上にコストがかかります、 コストとはどういう意味でしょうか? 処理時間という意味でしょうか?
- os6v100i
- ベストアンサー率44% (16/36)
あ、ちょっと勘違い・・・^^; 1重ループで処理する場合、さらに注意点があります でも、具体的にはご自分で調べてみてください^^;
- os6v100i
- ベストアンサー率44% (16/36)
ようは、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は|だったかと。
お礼
解決しました。 非常に参考になりました。 ありがとうございました^^
補足
ご解答ありがとうございます^^ 説明不足ですみません。 同じような処理を何回もしなければいけないので、できれば1つのループにしたいんです。
- asuncion
- ベストアンサー率33% (2127/6289)
>char Sanjigen[2][5][5]; >char Nijigen1[5][5]; >char Nijigen2[5][5]; この配列定義に対して、 >for( i=0; i<8; ++i ){ ループが一重なのはなぜですか?また、8という数値はどこから来ましたか?
お礼
ありがとうございました^^
補足
すみません。 8は5の間違いです^^;
お礼
解決しました。 非常に参考になりました。 ありがとうございました^^