• ベストアンサー

配列で行を取り出したい

x[3][3]={8,2,3},{5,2,5},{4,7,1} x[0][0],x[0][1],x[0][2]を取り出し、yy[0]={8,2,3} x[1][0],x[1][1],x[1][2]を取り出し、yy[1]={5,2,5} x[2][0],x[2][1],x[2][2]を取り出し、yy[2]={4,7,1} にしたいのですが出来ますでしょうか?

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

  • ベストアンサー
  • natural
  • ベストアンサー率37% (419/1115)
回答No.4

inetdさんから既に補足に対する回答がついておりますが、少しだけかみ砕いて説明してきます。 int *yy[3]; この宣言をご覧下さい。 yyはポインタの配列ですよね。 つまりyy[0]やyy[1]にはそれぞれintの領域のアドレスを格納出来ることになります。 次にこちらをご覧下さい。 int x[3][3]={{8,2,3},{5,2,5},{4,7,1}}; このような定義の時、例えばx[1][0]は5ですよね。 また、&x[1][0]はそのアドレスですよね。 と同時に、x[1]の配列の先頭アドレスでもあります。 そして、&x[1][0]はそのままx[1]とも書き換えられます。 つまりyy[cnt] = x[cnt]とは、例えばcntが1ならば、intのアドレスを格納する領域yy[1]にint型の配列の先頭アドレスであるx[1]を格納しているわけです。 図にすると、 yy[1]  x[1]  □ → □□□ と言う具合にyy[1]がx[1]の列の先頭を指している形になります。 解りにくかったら補足して下さい。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • inetd
  • ベストアンサー率23% (43/184)
回答No.3

> for(cnt=0;cnt<3;cnt++){ >   yy[cnt] = x[cnt]; > } > なぜこれでできるのですか?cntになにか特別な?ただのintですよね?(゜ρ゜) cntはただのintで別に特別なものではありません。 これはアクセスの方法の問題です。C言語の場合配列を表すように書くとその配列の先頭を指すポインタに変換されますよね。だからできるんです。 たとえば int x[3]; の宣言なら x は配列を表しますが、式の右辺で x を使用すると &x と同じ値になります。同様に int x[3][3]; で x[1] とすると &x[1] と同じになります。(これは通常 &x[1][0] と同じです。つまり先頭アドレス。厳密にいうと型が違うしどんなコンパイラでも同じとは限らないんですが、だいたいは同じになると思います)。

全文を見る
すると、全ての回答が全文表示されます。
  • natural
  • ベストアンサー率37% (419/1115)
回答No.2

こんなのもありですよ。 int x[3][3]={{8,2,3},{5,2,5},{4,7,1}}; int *yy[3]; int cnt; for(cnt=0;cnt<3;cnt++){   yy[cnt] = x[cnt]; } これ以降、yyはポインタ配列のままで参照することもできますし、二次元配列として参照することも可能です。 ただし、yyが参照しているのはxの配列ですので、この場合どちらかから値に変更が加わればもう片方から見ても変わります。 (同じものを参照しているのだから当たり前ですね)

googlegoogle
質問者

お礼

この場合 yy[0]={8,2,3}となるんですね。 さらにyy[0][0]=8 C言語のポインタの章で同じような事が書かれてました。 ありがとうございました。ただ、 int x[3][3]={・・・・} int *yy[3]; int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++){ yy[i][j]=xx[i][j]; } } でyy[i]={8,2,3}なら理解できるのですが、 for(cnt=0;cnt<3;cnt++){   yy[cnt] = x[cnt]; } なぜこれでできるのですか?cntになにか特別な?ただのintですよね?(゜ρ゜)

全文を見る
すると、全ての回答が全文表示されます。
  • inetd
  • ベストアンサー率23% (43/184)
回答No.1

宣言が int x[3][3] = {{8,2,3},{5,2,5},{4,7,1}}; int yy[3][3]; の場合は for ループを使って int i, j; for (i = 0; i < 3; i++)  for (j = 0; j < 3; j++)   yy[i][j] = x[i][j]; のようにすれば全部代入されます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 構造体の配列とメンバの配列

    typedef struct _ex_table1 {   int  x[10];   int  y[10]; }ETable1; ETable1 et1; int ans1; for( int a = 0; a < 10; a++ ){   et1.x[a] = a+10;   et1.y[a] = a*2; } for( int b = 0; b < 10; b++ ){   if( et1.x[b] == 15 ){     ans1 = et1.y[b];     break;   }   else{     ans1 = 0;   } } printf( "%d", ans1 ); ///////////////////////////////// typedef struct _ex_table2 {   int xx;   int yy; }ETable2; ETable2 et2[10]; int ans2; for( int aa = 0; aa < 10; aa++ ){   et2[aa].xx = aa+10;   et2[aa].yy = aa*2; } for( int bb = 0; bb < 10; bb++){   if( et2[bb].xx == 15 ){     ans2 = et2[bb].yy;     break;   }   else   {     ans2 = 0;   } } printf("%d", ans2 ); と言う感じに、微妙にソースを書いてみたのですが、 上のメンバ(x,xx)の値が正しいものがあったら、 対応する下のメンバ(y,yy)を出力したいと思っていますが、 構造体を配列にした場合と、構造体メンバを配列にした場合は どのように違うのでしょうか? 私には、同じように思えてしまいます。 どなたか、利点・欠点など教えていただけませんか? よろしくお願い致します。

  • 配列の文字置換え

    push(@xx1, $xx); push(@xx2, $yy); push(@xx3, $zz); $yyに含まれている「&lt;」と「&gt;」をそれぞれ普通の <、>に変換したいのですがどのように書けばいいですか? 教えてください。

    • ベストアンサー
    • Perl
  • 配列を利用したコードにしてください

    下記コードですが 計算速度が遅いので配列を利用した コードに修正してください。お願いいたします。 Dim mx As long Dim Rp As Double Dim yy1 As Double Dim pai As Double Dim Ba AS long Dim i As long, j as long Dim K As Doubke Dim xx1 As Double, yy1 As Double Dim x0 As Double,y0 As Double Dim x1 As Double, y1 As Double mx = Sheets("nn").Range("B65536").End(xlUp).Row Rp1= Sheets("pp").Range("B65536").End(xlUp).Row yy1= Sheets("pp").Range("A25") With Sheets("zzz") pai=Atn(1) * 4 Ba=Sheets("sheet1").Range("A1")  For I = 1 To Ba K = -Sheets("sheet1").Range("B" & I + 3).Value * pai/180 xx1 = Sheets("sheet1").Range("C" & I + 3).Value   yy1 = Sheets("sheet1").Range("D" & I + 3).Value  For j = 1 To mx - 1 x0 = .Cells(2 + j, 2) y0 = .Cells(2 + j, 3) X1 = x0 * Cos(K) + y0 * Sin(K) Y1 = -x0 * Sin(K) + y0 * Cos(K) .Cells(2 + j, 2 * I + 2) = X1 + xx1 - Rp1 .Cells(2 + j, 2 * I + 3) = Y1 + yy1  Next j  Next I End with

  • 配列から特定の語を含むものだけを取り出したいです

    var_dump($text); を実行すると array(XX) { [0]=> string(YY) "りんご食べたい。" [1]=> string(YY) "イタリアン食べたい。" [2]=> string(YY) "ごりら見た。" [3]=> string(YY) "雪まつりに行きたい。" [4]=> string(YY) "うさぎ可愛い!!" } という配列があり、そこから $key = array("りんご","ばなな","ごりら","うさぎ"); の単語を含む文章だけ取り出したいです。 以前も同じような質問をし、アンサーをいただき、このように試したのですが、 $key_text = array(); foreach($text as $v1){ foreach($key as $v2){ if(strpos($v1[0], $v2) !== false){ $key_text[] = $v1[0]; } } } var_dump($key_text); array(0) { } と返ってきてしまいます。どこが間違っているか教えて下さい。お願いします。

    • ベストアンサー
    • PHP
  • 連想配列の要素を追加

    表示結果が XX YY ZZ になるようにしてください。 $a = array(); $a['yy'] = 'YY'; $a['zz'] = 'ZZ'; //ここにコードを書く// foreach($a as &k){ echo $k . '<br>'; }

    • 締切済み
    • PHP
  • 行・列に隣り合う配列の要素を調べたい

    C言語でパズル的なものを作成していますが、 解らないことがありこちらで質問させていただきます。 何卒、よろしくお願いします。 ――――――――――――――――――― char list[7][7] = {   {0,0,0,0,0,0,0},   {0,0,0,0,0,0,0},   {0,0,0,0,1,0,0},   {0,0,1,9,1,0,0},   {0,0,0,1,1,0,0},   {0,0,0,1,0,1,0},   {0,0,0,0,0,0,0}, }; int result[7*7][2]; // [n][0]=x, [n][1]=y 例えば、上記のような配列があり、 list[4][4]の位置から探索開始したとします。 (解り易くするため仮に'9'を指定しています) このlist[4][4]から「上下左右」に調べ、 '1'があればそこから更に上下左右に調べるといった感じで、 '1'で繋がってる配列の要素番号を抜き出したいのです。 例えばlist[4][5]が'1'であるため、 次にlist[5][5]とlist[4][6]を調べます。 また、list[3][4]の上下左には'1'が無いのでこの配列の探索は終了となります。 上記例でいえば、'x'の点が求めたい要素番号に該当します。 char list[7][7] = {   {0,0,0,0,0,0,0},   {0,0,0,0,0,0,0},   {0,0,0,0,x,0,0},   {0,0,x,9,x,0,0},   {0,0,0,x,x,0,0},   {0,0,0,x,0,1,0},   {0,0,0,0,0,0,0}, }; このような処理をする上で、 何か良いアルゴリズム等は方法はないでしょうか?

  • R8Cマイコンの乗算

    R8C34Mを使っています。 例えば下記のコードを実行したら  unsigned long kai;  unsigned int xx;  unsigned int yy; xx = 0x07d0;  //10進で2000 yy = 0x0064;  //10進で100 kai = xx * yy; kaiは 0x30d40 となるはずが、0x0d40 でした。 kai = (unsigned long)xx * yy; と書き直したら、うまくいきました。 答えが2バイトを超えるのが分かっていたのでkaiはlong長にしました。 どうして右辺もキャストでlong長にしないといけないのでしょうか? また、下記のようにkaiをint長、xx,yyをchar長にした場合は、 kaiは意図する値の0x4e20 になりました。  unsigned int kai;  unsigned char xx;  unsigned char yy; xx = 0x00c8;  //10進で200 yy = 0x0064;  //10進で100 kai = xx * yy; どうして後者の場合はうまくできて、前者の場合はキャストしないといけないのでしょうか? この辺ご存知の方ご教授願います。

  • 微分

    2y^2 = x^2 + 3x + 1  …(1) の両辺をxで微分すると, 4yy' = 2x + 3 となりますが,左辺の 2y^2 → 4yy' は,何という公式なんですか? 合成関数の微分法であってますでしょうか? 教えてください。よろしくお願いします。

  • IplImageをHSの閾値から2値化をしようとしています.

    IplImageをHSの閾値から2値化をしようとしています. 表示させたい画像は1920x1080で取り込んだ1枚の画像の2値化です. しかし以下のプログラムを実行し実際画像を見てみると, 1枚の画像の中にx=1080以降から 同じ画像がもう一枚でてきます. どうすれば一枚の画像をそのまま2値化して表示することができますか? よろしくおねがいします. xx=1920; yy=1080; for(yy = 0; yy < frame->height; yy++) {   for(xx = 0; xx < frame->width; xx++)   { if(HSV[yy][xx].H > HMin && HSV[yy][xx].H < HMax && HSV[yy][xx].S > SMin && HSV[yy][xx].S < SMax) {   src_buf[frame->width * yy + xx] = 1;   frame->imageData[frame->widthStep * yy + xx * 3] = 0x00;   frame->imageData[frame->widthStep * yy + xx * 3 + 1] = 0x00;   frame->imageData[frame->widthStep * yy + xx * 3 + 2] = 0x00; } else{   src_buf[frame->width * yy + xx] = 0;   frame->imageData[frame->widthStep * yy + xx * 3] = 0xff;   frame->imageData[frame->widthStep * yy + xx * 3 + 1] = 0xff;   frame->imageData[frame->widthStep * yy + xx * 3 + 2] = 0xff; }   } }

  • 関数で定義した配列のソート

    お世話になります。 配列のソートは xx = new Array(3, 7, 8, 1); xx.sort(); document.write('xx='+xx+'<br>'); function hikaku(a, b) { return(b - a); } yy = new Array(3, 7, 8, 1); yy.sort(hikaku); document.write('yy='+yy+'<br>'); で、できました。 ここで、 function aitem(name,value,date){ this.name=name; this.value=value; this.date=date; } var goods=new Array( new aitem('b',500,'06/05/01'), new aitem('a',200,'06/07/01'), new aitem('d',800,'06/06/01'), new aitem('c',300,'05/09/01'), ); と、配列goodsを定義します。 そして、例えばvalueで並び替えた配列を取得するなんてことはできないでしょうか。 よろしくお願いします。

このQ&Aのポイント
  • WAB-MATのアクセスポイント管理ツールを使用していると、WAB-M1775-PSの死活監理が管理画面から確認できません。
  • しかし、ping通信は正常に行われ、アクセスポイントも正常に動作しています。
  • 最新のファームウェアを使用しているため、問題を解決する方法はありますか?
回答を見る

専門家に質問してみよう