malloc関数を知って少し救われた話[自分メモ]
今までずーっと研究はperlでやっていた
自然言語処理だし,文字列使うし
文字列扱うのに便利なperlさんにどっぷりお世話になって3年間
研究が変わり,もはや自然言語処理なのかと疑問に思うような内容で
数値処理だけの世界へこんにちは
単語や品詞たちよ,どこへ消えたの....
寂しさに暮れている中,担当教授の一言
「君はperlに毒されすぎだ,これからはC言語で書こう」
訳:プログラムがスパゲッティ,動的型付け言語に甘えすぎ,ちょっと型付けを勉強しなさい
私は絶望した
動的型付けじゃない言語なんて
プログラミングへの時間コストがでかすぎる!死ぬ!進捗が消える!
この時2週間ぐらいブツクサ言いながらC言語で書いてた
C言語に触れるなんて,かれこれ,4年前にプログラミングの講義でちびっと触った以来で
スムーズに書けるはずなくメモリ管理にイライラしてた
ある日,自動化したいと思った
基本的なプログラムは周りの助けもあり,なんとか完成
あとはズバババッ!と自動化できればおk
やりたいことは 配列の長さをシェルで回して逐次的に変えること
と,ココで気づいた.
マジ作業だわこれ(・ω・)コンパイルしているせいで配列の長さをシェルとかで適宜変更出来ない、めんどー
— ごま@卒業目指すぽよ (@gomaaburamax) 2014, 6月 19
C言語で標準入力から配列の長さを指定する方法
教えてエロい人
— ごま@卒業目指すぽよ (@gomaaburamax) 2014, 6月 19
ってかC使ってる研究室はパラメータ調整とかで配列の長さをズバババって変えてるんじゃないっすか(迫り)
— ごま@卒業目指すぽよ (@gomaaburamax) 2014, 6月 19
ここである研究室の方に教えてもらったのは,今回の本題
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