理論は後からついてくる?!

12/10/1999 by Shigeyuki Seko


応用編

6) ちょっと C のお勉強

次のステップに進む前に、ここで C 言語について簡単に説明します。本当に簡単な最低限知っておきたい事項のみですので詳しくは C 言語について書かれた専門書等を参考にしてください。本屋さんに行けばよりどりみどりです。

C 言語は一言で言うと関数の集まりです。中学の数学で習ったと思いますが

f(x,y) = 3x+4y+12

とか言うやつです。この f(x,y) が関数です。この時、関数 f(x,y) に x=1,y=2 の引き数を渡すと23 という答えが返ってきます。こうした関数の集まりが C言語です。
実際に C のソースを見てみましょう。以下は book.c の冒頭部分です。

 

/******************************
  Picture Book program
  TAB = 4
  Shigeyuki Seko
  12/6/1999
******************************/

#include  <Pilot.h>
#define  MaxPage 10

Int Page;

static void drawBitmap(Int x, Int y, Int id)
{
  VoidHand h;
  VoidPtr p;
  h = DmGet1Resource('Tbmp', id);
  if(h != NULL){
    p = MemHandleLock(h);
    WinDrawBitmap((BitmapPtr)p, x, y);
    MemHandleUnlock(h);
    DmReleaseResource(h);
  }
}

/********************************
Start
********************************/

static void StartApplication(void)
{
  FormPtr  frm;
  FieldPtr   opPtr;
  frm = FrmInitForm(1000);
  FrmSetActiveForm(frm);
  FrmDrawForm(frm);
  drawBitmap(5, 20, 7000);
  Page=0;
}

 

ややこしく見えるかも知れませんが関数という区切りで見ていけば簡単です。
関数の定義は、たとえば  

f(x,y) = 3x+4y+12

をC言語で定義すると以下のようになります。

int f (int x,int y)
{
  int answer;
  answer = (3*x)+(4*y)+12;
  return answer;
}

x,y,answer の前に付いている int はそれにつづく変数が整数であることを示しています。C言語の場合扱う変数の型がなんであるか最初に使用する時に宣言する必要があります。こうして見ると C言語の大部分の処理は関数の定義と関数の呼び出しであるとも言えます。
さてこうした目で最初のソースをながめてみましょう。

ソースの最初部分

static void drawBitmap(Int x, Int y, Int id)
{
  VoidHand h;
  VoidPtr p;
  h = DmGet1Resource('Tbmp', id);
  if(h != NULL){
    p = MemHandleLock(h);
    WinDrawBitmap((BitmapPtr)p, x, y);
    MemHandleUnlock(h);
    DmReleaseResource(h);
  }
}

ここでは drawBitmap という関数を定義している事がわかります。引き数として座標のx,y、ビットマップファイルの id 番号を渡すと画面に描いてくれます。
void は返り値が無いという意味です。先に説明した f(x,y) は答えが返ってきますが、C言語のプログラムでは数字としての返り値のない場合も多く存在します。 drawBitmap では画を描く事が目的ですので数字としての返り値を持ちません、したがって返り値なしの void と宣言します。
つぎに実際にこの関数を呼び出している部分を説明します。
例として StartApplocation での呼び出しを以下に示します。 

/********************************
Start
********************************/

static void StartApplication(void)
{
  FormPtr  frm;
  FieldPtr   opPtr;
  frm = FrmInitForm(1000);
  FrmSetActiveForm(frm);
  FrmDrawForm(frm);
  drawBitmap(5, 20, 7000);
  Page=0;
}

簡単ですね。まとめると以下のような感じです。

こうして見ていくと、いかに C言語がシンプルなルールであるかが解ります。
この drawBitmap を呼び出している StartApplication も関数ですから、誰かから呼び出される訳です。こうして main から始まってプログラムが終了するまで関数は順に呼び出され、それぞれの仕事をします。
こうした関数の単位で見ていくと、一見繁雑に見える Cのプログラムがそれぞれ役割が決められて整然と並べられているように見えてくると思います(そう願います:)

 

次は絵本に音を付けてみましょう