概ね方位不定だが多分割と偏っている
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


C 二次元配列を渡す
2006年08月24日 (木) | 編集 |
カレーにトマト入れてみたんだが悪くないかもしれぬ。
というか鍋1杯のカレーに対しトマト2個では何が変わったのかよく分からん風味。
ちょっと酸味が増えたかも程度?


一次元配列を渡せるなら二次元配列も渡せるだろうって話。
列要素が混ざってくるので面倒そうには思えるのだが。


そのままだな。
二次元配列も一次元配列と同様、関数に渡すことが出来る。

int a[5][10];

という二次元配列を関数funcに渡すには、

func(a);
  ↓ 先頭のアドレスを渡す
func(int a[ ][10])
{
 なんか式
}


とする。[ ]が増えたくらいで一次元配列と殆ど変わらんね。
例によって行要素は省略可能なんだが、列要素は省略出来ない。
関数側で参照するにはa[i][j]といったように指定してやればいいのは同じ。

形式以上。
後は実際にやってみるとしよう。
行列を初期化する関数を作ってみる。

void setarray(int a[ ][5],int dat)
{
 int i,j;
 for(i=0;i<5;i++)
  for(j=0;j<5;j++)
   b[i][j]=dat;
}


関数setarrayに配列a[][]の先頭アドレスを渡し、配列を初期化するデータも渡し、
二次元配列を扱う際のお約束、多重ループの為にループ変数を2つ宣言する。
後は多重ループを使って全ての行列にdatを渡せばOK。

次はメイン部分。

void main(void)
{
 int a[5][5];
 int i,j;
 
 setarray(a,99);


二次元配列a[5][5]を宣言し、二次元配列のお約束の多重ループ以下略。
関数setarrayに配列aの先頭アドレスと初期化すべきデータ99を渡す。

 for(i=0;i<5;i++){
  for(j=0;j<5;j++){
   printf("%3d",a[i][j]);
  }
 printf("\n");
 }
}


で、多重ループで表示部分を書く、と。

array_test.jpgarray_test2.jpg
こんな感じ

おまけ
行要素と列要素を指定出来るようにしてみる

void setarray(int *a,int m,int n,int dat)

行要素と列要素を引数として変数k、変数lに渡して

{
 int i;
 for(i=0;i  *a=dat;
  a++;
 }
}


ループ変数としてiを宣言し、ループ文で行要素x列要素分だけ(多分)*aを進め、datにある数値を代入して初期化する。行要素x列要素分ってのがイマイチよく分からないが。
まあいずれ分かるかもしらんので今は置いておこう。
とにかく、これで関数部分はOK。
次メイン部分。

void main(void)
{
 int a[5][8];
 int i,j;


二次元配列aを宣言し、例によってループ変数を2つ宣言する。
ここまではいいのだが…
 
 arrayset((int *)a,5,8,99);

関数呼び出しにどうも見慣れないモノがいらっしゃる。
(int *)aとかいうのがそれだな。これはキャストと呼ばれる演算子で、オブジェクト(変数や定数など)の型を、一時的に指定された型に変えるという性質を持つ。
この場合はaの型を一時的にint型のポインタにしているわけだな。
自分で言っててさっぱり意味わからんけど。

だが実際arrayset(a~)とやるとコンパイラさんに文句を言われてしまうので仕方ない。
キャストに関しては後でやるそうなので例によって今はそういうことにしておこう。
ま、とにかくこれで関数arraysetに先頭アドレス、行要素、列要素、初期化用の値を渡したことになるので、後はそれを表示して終わり。

 for(i=0;i<5;i++){
  for(j=0;j<5;j++){
   printf("%3d",a[i][j]);
  }
 printf("\n");
 }
}


ここは何も変わらんね。

array_test3.jpgarray_test4.jpg
こんな感じ

まとめよう

一次元配列を関数に渡すのと同様、二次元配列も関数に渡せるぜ
行要素と列要素も渡そうと思ったらキャストとか使わないと駄目なようだ


以上。
一次元配列に列要素がついただけなんだが妙に面倒臭い話になったな。
スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。