一度挫折した「C言語」学習に再チャレンジ!
こんにちは!サトルと申します。
今回から、「C言語」の習得に再度チャレンジすることにしました。
「再度」というのは、以前に学習をしたときに一度挫折してしまったのが「C言語」だからです。
「ゲーム開発」では、「C言語」が主に利用されているとのことで、今後ゲームを作るためには「欠かせない言語」となりそうなので、難しそうだけど、また「C言語」の学習に取り組んでいきたいと思います。
「C言語」の第一歩
「C言語」の開発を行うためには「コンパイラ」という、ソースコードを「機械語」に変換するプログラムが必要なのですが、「GNU Compiler Collection(GCC)」と呼ばれる、さまざまな言語の「コンパイラ」を扱うコレクションの中の「C言語コンパイラ」を利用することにしました。
GCCのツール群は「GNUツールチェーン」と呼ばれているそうで、「MinGW」というソフトウェアでWindowsにこれらの「GNUツールチェーン」をインストールできるので、「MinGW」を使ってみました。
プログラムを書くためのエディタはいろいろなものがあり、何を使うのかを悩んだのですが、「Eclipseでいいんじゃない?」とエンジニアの友人からアドバイスをもらったので、「Eclipse」を使うことにしました。
と、サラっと書いたんですが、この2つをクリアするためにもかなり苦戦・・・
まず、「MinGW」の使い方がわからず、いろいろなドキュメントを探しあぐねて、2時間ほど費やし、EclipseからGCCを使い方法がわからず、さらに1時間ほど費やしました。
「環境構築」だけでも、こんなに時間がかかると初心者には結構大変な作業でした。
プログラムの書き方(基礎)
「C言語」は、「main」という関数を作り、そこから処理がスタートするので、まず「main」関数を作る必要があります。
int main(void) { // 何かの処理を書く }
「戻り値」が「int型」で「main」が「関数名」、「void」は「引数」が何もない場合に書くそうです。
一回勉強したはずなんだけど、もう完全に忘れてた・・・
普段からプログラムを書いていないとどんどん忘れていってしまいますね。
「main」関数の中にはいろいろな命令文を書いていくことで、さまざまな処理を行うことができます。
C言語には、あらかじめさまざまな関数が用意されていますが、それらを使うためには、「ヘッダーファイル」を読み込む設定を書く必要があります。
「ヘッダーファイル」は、拡張子が「h」となっているファイルで、
#include <ヘッダーファイル名>
と書くと指定した「ヘッダーファイル」を読み込むことができます。
C言語でほぼ必須となる「ヘッダーファイル」が「stdio.h」で、「入力・出力」を行う機能を使うことができるようになります。
これを使うためには、
#include <stdio.h> int main(void) { // 何かの処理を書く }
と書くことで、「main」関数の中で、「入力・出力」機能を使うことができるようになります。
例えば、画面に文字を出力する場合は、「printf」という関数を使うと標準出力に文字などを表示することができるようになります。
#include <stdio.h> int main(void) { printf("Hello!!"); }
このプログラムを実行すると、
Hello!!
と文字が表示されるようになります。
といっても、この当たりは以前にも学んだところで、躓くところは何もなかった部分。
もう少し先に進むと、以前に躓いた強敵が待ち受けています(笑)
「stdio.h」の内容をもう少し詳しく見てみる
「stdio.h」の内容を直接見てみたのですが、1000行を超えていて、かなり大規模な「ヘッダーファイル」でした。
「ヘッダーファイル」はいろいろな関数等の定義を行っているファイルです。
いろいろな関数を見ている中で気になったことが「Buffer Over Flow(バッファオーバーフロー)」を起こす関数があることでした。
「Buffer Over Flow(バッファオーバーフロー)」って何?
メモリの中の「Buffer(バッファ)」という領域にデータを格納する際に、格納するデータの量が多くて、バッファから溢れるという現象のことを言うそうです。
今までプログラムを学んでいても、このような話を聞いたことが無かったので、なかなか興味深いことと、プログラムを書く側が気を付けて使わないといけないということですね。
こういう内容を目にすると「C言語」を使うことの難しさを実感したりもします。
C言語は初心者が学ぶにはやっぱり敷居が高いな~ということも実感したり・・・
「stdio.h」の関数
「stdio.h」をインクルードすることで利用することができる関数について見ていきたいと思います。
- printf
- 標準出力に文字列を出力する
- scanf
- 標準入力からデータを取得する
この2つの関数は「入力と出力」行うためのベースになる関数となっているようで、例えば、「ストリーム」というものを対象に「入力と出力」を行う場合は、
「ストリーム」の意味を調べると「流れ」という意味があるそうです。
プログラムから見た「ストリーム」は、「何かのデータの流れ」を表していて、「画面」であったり「ファイル」であったり、何かへの「入出力」を行える対象を表しているようです。
- fprintf
- ストリームに文字列を出力する
- fscanf
- ストリームからデータを取得する
という形で、先頭に「f」を付けると、「ストリーム」への処理が行えるという仕組み。
あまり「ストリーム」という考え方に馴染みが無いので、自分にとっては「新しい考え方」でした。
「stdio」というのは「standart input output」の略記みたいなので、英語にすると、そのままですね(笑)
他にも「ファイル操作」を行う関数なども用意されています。
- fopen
- ファイルを開く
- fclose
- ファイルを閉じる
と言ってもファイル操作はまだ勉強したことが無いので、後ほど勉強していきたい。
他にもまだまだたくさん関数があるので、いろいろなプログラムを書いてどのような結果になるのかを、試していきながら、それぞれの関数の使い方を身に付けていきたいと思います。
次回は、何か実際にプログラムを書いて動かしていきます♪