1.8 構造体、そして関数 Menuへ戻る

  実はワタクシ構造体を自分で作った事はないのです。ですが、いつも使います。
要するに構造体のプロになる必要はないのです。しかしC++のクラスというのは
この構造体を拡張した様な物なのです。よって構造体を知る事は大事です。自分で
作った事がないというのは、構造体を作るくらいならクラスを作るからです。

  ま、簡単に言いますと既存の変数型を組み合わせた新しい型を定義するという事
で、例として 敵キャラ型 というのを作りましょう。ゲームの中の敵キャラにはど
のような要素があるでしょうか、まず名前、これは文字列ですね。それから体力、
これは整数でいいでしょう。そして強さ、これも整数としましょう。今の所、これ
くらいにして、これだけの要素を持つ Enemy という型を定義します。

  struct Enemy {
    char Name[30];
    int iHelth;
    int iPower;
  };

  これで完了です。Enemy型は定義できました。

struct [型の名前]
{
    要素;
    要素;
     ・
     ・
     ・
};

  というのが書式です。では実際に Enemy型の変数を作ってみましょう。

  struct Enemy ZAKO[5];  /* ザコキャラを5匹つくる */
  struct Enemy BOSS1;    /* これは中ボス */
  struct Enemy BOSS2;    /* これは大ボス */

  といった具合です。それではどのように要素を使うのでしょうか、それは" ."
ピリオドです。これを使って要素名を書きます。一番目のザコキャラに要素を入れて
あげましょう。

  strcpy(ZAKO[0].Name,"ヨワボン");  /* 文字列なので strcpy を 使う */
  ZAKO[0].iHelth = 10;              /* 体力 10 */
  ZAKO[0].iPower = 5;               /* 力 5    */

  要するに . を付けて要素を書くと呼び出せるのです。ともかくこういうもんだ
という事を理解して下さい。

  さてさて関数です。これをC言語講座の最後にします。関数はそんなに難しい事
はありません。しかし、関数内における変数の有効範囲というのは非常に重要で、
よく間違われます。じっくり腰を入れて読んで下さい。

  まず、一番簡単な関数の使用例を書きます。ここで忘れてはいけないのは、OS
は必ず main() を呼び出すという事です。プログラムの先頭から実行されるのでは
ないのです。まず、OSが main を呼び出し、その後 main の中で Message() とい
う関数を呼び出して、処理が Message() の中に移り、printf 文 が実行され
「関数の例」と表示されるのです。

  関数の呼び出し方は 関数名と() です。

#include <stdio.h>

void Message()             /*****************************/
{                          /*  この部分が関数の定義     */
    printf("関数の例");    /*                           */
}                          /*****************************/

void main()                /*****************************/
{                          /*  OSが呼び出す部分       */
    Message();             /*                           */
}                          /*****************************/

  では、これをちょっと拡張してみましょう。引数というのを付けるのです。
今のままではあまりにも何もしないので関数とは呼べません。関数に数字を
渡して、その数値の内容も表示するようにしたいのです。

  では整数を受け取る為にはどうすればいいか、それは関数定義の部分で、

void Message(int iSuji)
             ^^^^^^^^^
  として、整数を受け取りますよ、と書いてやればいいのです。そして受け取った
数値を iSuji に入れなさい、という事でもあるのです。つまり Message という関
数は整数を受け取り、受け取ったら iSuji に代入するのです。

  では、渡す方はどうすればいいか、というと呼び出す時に Message(10) などと
してカッコの中に数字を書けばいいのです。では全部書いて見ましょう。

#include <stdio.h>

void Message(int iSuji) ;/* 引数を受け取る様に改良 */
{
    printf("数値 = %d\n",iSuji); /* 受け取った数値を表示する */
}

void main()
{
    Message(10);
}

  どうですか?数値 = 10 と表示されましたか?引数を渡す時に、何も数字を
直接渡す必要はありません。受け取る側と同じ型なら変数でも構いません。
では、また改良して 1から10まで表示させる様にしましょう。

#include <stdio.h>

void Message(int iSuji) ;
{
    printf("数値 = %d\n",iSuji);
}

void main()
{
    int i;/* カウンタ用 */
    for (i = 1;i< 11;i++)
        Message(i);       /* i を引数にして Message() を呼び出す */
}

  もう、大体わかったでしょうか?もちろん引数はいくつでも構いません。2つ
の例を書きます

void Message(int iSuji1 , int iSuji2)

  と書けば2個の引数を持つ関数の出来上がりです。","で並べればいくらでも
引数をもてます。また、呼び出す方ですが、こちらも同じく","で並べて、複数
の引数を渡します。

  Message(5,2);

  では、足し算をしてくれる関数を作りましょう。

#include <stdio.h>

void Add(int iValue1, int iValue2)
{
    printf("合計 = ",iValue1 + iValue2);
}

void main()
{
    Add(50,199);
}

  ここでは合計を表示しているのですが、表示をせず、数値を返して欲しい時
にはどうすればいいでしょうか、それには return というのを使います。

  まず、Add 関数が整数を返すという事を宣言するために定義式は void ****
から int **** に変わります。実は void というのは 何も返さないよという事
なのです。

int Message(int iValue1,int iValue2)
^^^
  で値を返す準備ができました。さて、どうやって返すかは return を使います。
まず、足し算用に変数を一つ作ります。そして、その変数に足し算の結果を入れ
てやり、return [変数]; とするのです。

int Message(int iValue1,int iValue2)
{
    int iSum ; /* 足し算結果用 */

    iSum = iValue1 + iValue2;

    return iSum; /* iSum を返す */
}

  これで完成です。では返された数値を受け取る方も変更が必要です。

void main()
{
    int iRet ; /* 受け取り用の変数 */

    iRet = Message(50,199); /* 呼び出して結果を受け取る */

    printf("結果 = %d\n",iRet);
}

  これでコンパイルしてみましょう。きちんと動いていますか?だんだんと難しく
なってきています。キッチリついてきて下さい。今回は長くなったのでこれまで、
次回も関数です。では。