ぬぬん!

やってみたこと,思ったこと

malloc関数を知って少し救われた話[自分メモ]

f:id:gomayumax:20140628020620j:plain

今までずーっと研究はperlでやっていた

自然言語処理だし,文字列使うし
文字列扱うのに便利なperlさんにどっぷりお世話になって3年間

研究が変わり,もはや自然言語処理なのかと疑問に思うような内容で
数値処理だけの世界へこんにちは

単語や品詞たちよ,どこへ消えたの....

寂しさに暮れている中,担当教授の一言

「君はperlに毒されすぎだ,これからはC言語で書こう」
訳:プログラムがスパゲッティ,動的型付け言語に甘えすぎ,ちょっと型付けを勉強しなさい

私は絶望した

動的型付けじゃない言語なんて
プログラミングへの時間コストがでかすぎる!死ぬ!進捗が消える!

この時2週間ぐらいブツクサ言いながらC言語で書いてた
C言語に触れるなんて,かれこれ,4年前にプログラミングの講義でちびっと触った以来で
スムーズに書けるはずなくメモリ管理にイライラしてた

ある日,自動化したいと思った

基本的なプログラムは周りの助けもあり,なんとか完成
あとはズバババッ!と自動化できればおk

やりたいことは 配列の長さをシェルで回して逐次的に変えること

と,ココで気づいた.

ここである研究室の方に教えてもらったのは,今回の本題

malloc関数

プログラムで予め配列などを使ってメモリを確保せずに、必要な場所で必要なだけメモリを確保することが出来ます。木構造やリストなど多くのデータ構造は、通常 malloc関数によって動的にメモリを確保します。
(参照:malloc)

これです,私がやりたいの.

テストプログラム

拙いですが,プログラム晒す

綺麗ではないかもだけど
参考までに

「標準入力から2次元配列の要素数を受け取って2次元配列を作っちゃおう」

int main(int argc, char **argv){
  int **data;
  int n, m, i, j;

/*受け取った引数を文字から数字に変換*/
  sscanf(argv[1],"%d",n);
  sscanf(argv[2],"%d",m);

/*配列定義(malloc)*/  
  data = (int **)malloc(sizeof(int *) * n);
  for (i=0;i<n;i++) {
    data[i] = (int *)malloc(sizeof(int) * m);
  }

  for (i=0;i<n;i++) {
    for (j=0;j<m;j++) {
      data[i][j] = i*j;
      printf("%d\n", data[i][j]);
    }
  }

  /*配列メモリ解放*/
  for (i=0;i<n;i++) {
    free(data[i]);
  }
  free(data);
}

ちなみに,mallocを使った2限配列の作り方は,いろんなやり方があるらしいので
ここ(C言語で2次元配列を動的に割り当てる4つの方法 - FLYING)を参照してください

おまけ:「double型の1次元配列を作っちゃおう」

int main(int argc, char **argv){
  double *data;
  int n, i;

/*受け取った引数を文字から数字に変換*/
  sscanf(argv[1],"%d",n);

/*配列定義(malloc)*/  
  data = (double *)malloc(sizeof(double ) * n);
  for (i=0;i<n;i++) {
    data[i] = i;
    printf("%f\n", data[i]);
  }

  /*配列メモリ解放*/
  free(data);
}

まとめ

C言語でも動的型付けもどきがmalloc関数を使うことで可能になる
知らなかったすごいラク!
mallocを使った標準入力からの配列定義,2次元,1次元の記事がパッと見,見つからなかったので自分メモも含めて書いた.
プログラミング上手くなりたい\(^o^)/

追記
なんか講義で習ってたらしいwww
うへwww思い出しました記事ということで許してwww