コードの書き方

さてこの辺でいよいよウィンドウズ上でグラフィックを扱うわけですがグラフィックを転送したりキャラクタを重ねたり、ヒットポイントを計算したりするのにはどうしてもC言語を使わなければなりません。
先延ばしにしていたC言語の文法の説明をここでやります。

文法というのは関数以外のC++コンパイラが解釈することのできる文と定義しましょう。

CPUから見た場合、必要な命令はそれほど多くありません。
必要不可欠な命令は、

1 データを移動する
2 データを計算する
3 判断する
4 プログラムのジャンプ

の4つぐらいです。
複雑な命令もこれらを組み合わせればできます。
しかしこれでは「鋸とかなづちがあれば家を立てることができる」と言うに等しいことです。
確かに本当の事ですが、やはり電動鋸や、電気かんなを使ったり、2×4のパーツを使う方が早いしきれいだし簡単です。

CPUは命令を増やす方向で進化してきました。
C++も便利な命令を増やしてきたわけですが、複雑なものはほぼ関数が受け持っています。
ですからCの文法といってもちょっとしかありません。
だからマスターするのも簡単です。
その数わずか9種類。
うーん、簡単そうですね。
ただ、書き方のルールというものがやはりあり、それを含めて数えると覚えることはぐんと増えます。

まず、コンソールプログラムを作ってみます。
なぜコンソールプログラムなのか。
それはコンソールプログラムが単純な構造になっているからです。
飛行機の運転を習うのにはじめからジャンボを使うと、実際に操縦間を握るまでに管制塔とのやりとりや国際法規の勉強をしたりしなければならなくなります。
本来の目的である飛行機の操縦を学ぶためにはそのように余分なものは無い方がよいのです。
操縦ができるようになってからジャンボに必要な知識を付け加える方が合理的です。

ウィンドウズのプログラムも同じで、VC++でウィンドウズのプログラムを作るとVC++が必要ではあるけど余計なコードをたくさん書くのでCの勉強部分に集中できないわけです。

ではコンソールプログラムを作ってみましょう。
いままだ testというプロジェクトを開いたままの人は閉じて下さい。
新しく cons  というプロジェクトを作ります。

ファイル>>新規作成で新規作成ダイアログを開きます。
プロジェクトタブの中の Win32ConsoleApplicationを選びますプロジェクト名は cons とします。
OKを押すといきなりダイアログは閉じてしまいます。

ワークスペースのClassViewを見てください。
クラスの中は空です。
FileViewを見てください。やはり空ですね。

コンソールプログラムは、ウィンドウズプログラムのようにあらかじめ必要なウィンドウを書く部分やボタンを置くスペースといった物がありません。
つまり、コンソールプログラムのプロジェクトには何も含まれていない、つまり、空なのです。
これは1から全部自分でソースを書かなければいけないと言う意味です。

でも心配は無用です。
ウィンドウズのように必要不可欠な部分は極小だからです。

始めにビルドしてみましょう。
すると、「ビルドするソースファイルはありません」というエラーメッセージが出ます。
ほう、ではソースファイルから作らなければいけないという事ですね。
というわけで、ファイル>>新規作成>>を選択してファイルタブの中のC++ソースファイルを選択します。
ファイル名はプロジェクトと同じく cons としておきましょう。
OKを押すと cons.cpp というウィンドウが開きました。
これが今出来た cons.cpp というC++のソースファイルです。

ではここに、頭から次のソースを打ち込みましょう。
 

 #include <stdlib.h> //-----1
 #include <iostream.h> //-----2
 
 int main() //-----3
 { //-----4
 cout << "Hello Console!!";//---5
 } //-----6
 

「//-----」という部分は打ち込む必要はありません。
後で説明するための番号です。
またHello Console の部分は初めての記念すべきコンソールプログラムなので好きなメッセージを入れてみましょう。

びっくりマークをクリックして実行します。
コンパイルでエラーがでたら打ち込みミスなのでよくソースを見比べて直して下さい。

成功すると、黒いDOS窓が開いて



というようなメッセージが出ます。
これでOKです。

何かキーを押すとDOS窓が閉まります。
このようにウィンドウズ上からコンソールプログラムを実行すると、ウィンドウズは自動的にDOS窓を開いてプログラムを実行し、終了するとまた自動的に閉じます。

スタートボタンからDOSプロンプトをクリックしてDOS窓を立ち上げてからコンソールプログラムを実行すると終わってもDOSのプロンプトに戻るだけでDOS窓は閉じません。

まずこのプログラムの1行目と2行目ですが、

#include <stdlib.h> //-----1
#include <iostream.h> //-----2

stdlib.h と iostream.h を使うぞ、という意味です。
このように書く事をインクルードすると表現します。
ここでは、stdlib.h と iostream.h をインクルードした(している)というわけです。
インクルードするとは含めるという意味ですね。
このcons.cpp というソースファイルに stdlib.h と iostream.h という二つのファイルを含める訳ですが、このファイルは何でしょうか。
拡張子が h のファイルは、C、C++ではヘッダファイルと呼ばれるものです。
これは関数がたくさん入ったライブラリの目録の様なものです。

関数はリンクするまで本体はありません。
cons.cpp をコンパイルするときにこの関数はありますよ、あとでリンクしますよという意味になります。コンパイラは本体が無いけれども仮にある事にしてその部分を空白にしておきます。内からといってエラーを出さないわけです。
その部分はリンカが後からうめるので最終的には正しい関数が組み込まれて実行ファイルがちゃんと出来上がります。

3行目の

int main() //-----3

ですが、これはコンソールプログラムの先頭部分です。
メイン関数といいます。
コンソールプログラムは、このメイン関数がすべてです。
メイン関数の中は次の

{ //-----4
cout << "Hello Console!!";//---5
} //-----6

です。

メイン関数はカッコ4行目と6行目の間ですべての処理を行います。
ここでは5行目の メッセージ Hello Console!! という文字列を画面に表示することです。
このあは終わりのカッコに到達するので終わりになります。

このように何かを表示して終わり、などというものなら良いですが、ずらずら長いプログラムになったらどうしたら良いでしょうか。

答えは「自分で新しい関数を作ってメイン関数から呼び出す」です。

新しい関数を作ってメッセージを呼び出す見本を見てみましょう。
 

 #include <stdlib.h>
 #include <iostream.h>
 void Disp_Mes(string s); // 自分で作った関数のプロトタイプ宣言
 
 int main() // メイン関数
 {
 
 Disp_Mes("Hello Console!!);
 
 }
 
 void Disp_Mes(string s) // 自分で作った関数
 { 
 cout << s;
 }
 

プロトタイプ宣言では自分の作った関数を先に書いておきます。
これをプロトタイプ宣言といいます。
本体は、下にあります。
実はこのプロトタイプ宣言は、ヘッダファイルに書くのが普通です。
小さなプログラムでソースが1本ならかまいませんが大きくなるとお互いにお互いの中の関数を使うことになります。
そのとき、自分の中に関数の宣言がないとコンパイラがエラーを起こします。
これは先のインクルードファイルの宣言で説明したことと同じです。
stdlibの中の関数を使うのも隣の席の社員だか友人だかが作った関数を使うのもコンパイラにしてみれば同じです。
ですから自分のソースは、ヘッダファイルとソースファイルの2本で一組になります。
これも小さなプログラムならまとめて1本でもかまいません。

まあ、こうやってメイン関数からほかの関数を呼ぶ、というふうに作るとだらだらと長いメイン関数を作らなくても大丈夫という訳です。

メイン関数は短くてなにをやっているかわかれば言うことはありません。
ほかにCの関数を作る再、外見で気をつけることをいくつか書いておきます。

1 コメントを必ず書いておく事。
  コメントの最初は、ソースファイルの先頭にあります。
  このプログラムは誰がいつ書いたものか、何をするものかなど、他人にわかるように書いておきます。
  他人に見せる予定は無い、というひとでも同様です。
  なぜなら、3ヶ月後の自分は他人だからです。
  3日後でも危ないでしょう。少なくともプログラミングの最中に覚えていた短期記憶は
  完全に飛んでいます。
  バグがあって直すときもコメントから記憶を手繰っていくことが有効です。
  ソースの先頭にあるコメントはたとえばこんなものです。
 

////////////////////////////////////////////////////
// メールを差出人ごとに分けて保存するプログラム   //
// メールのソースはIE40のメールフォルダにあるINBOXファイル
// //
// 1999-1-1 makiyama //
////////////////////////////////////////////////////
 

最低これぐらいの情報を入れておきます。
次に必要なコメントは関数ごとに説明を入れておくことです。
たとえば
 

////////////////////////////////////////////////////
// IE40のINBOXファイルから指定した差出人のファイルを切り出す
// //
// 1999-1-1 makiyama //
////////////////////////////////////////////////////
 string Cut_1_mail(string name) // 戻り値は切り出したストリング
 {
 
 }
 

こんな感じでしょうか。
書き方は自分がかっこいいと思う書き方で良いのです。
また、Cは改行を好きな場所にいれてかまわないので以下のような書き方も許されます。
もちろん、1234という数値の途中で改行するのは御法度です。
改行して良いのはスペース、カンマ、カッコの場所などです。

下の二つの関数は同じです。
 

 int Make_datastring(s_name,o_name,s_age,o_age,s_add,o_add);

 int         // 関数が成功すると0を返す、それ以外は1を返す
 Make_datastring(
 s_name, // 元の名前
 o_name, // 変更後の名前
 s_age, // 元の年齢
 o_age, // 変更後の年齢
 s_add, // 元の住所
 o_add // 変更後の住所
 );
 

なにをする関数か知りませんが、どちらが好ましいかは歴然としていますね。
皆さんもカッコ良くて読みやすいソースを書くことを心がけて下さい。

さてこれでコンソールプログラムを作り方が大まかにわかりました。
ここから本格的に文法に入ります。