第3回 第2回へ 第4回へ 目次へ
2006 / Jul / 22
はじめに
 このサイトは、プログラミングが始めての方やC言語を学習されていない方を対象に、Macのプログラミングの手法の中から「 Cocoa (ココア)」と呼ばれるものを紹介しています。
 プログラムは、プログラミング言語によって書かれているということはご存知だと思います。Cocoaでは、Objective-C言語というC言語を発展させたプログラミング言語を使用しています。この「Objective-C Primer」では、Objective-C言語を理解する上で必要となるC言語の基礎を学習して、Objective-CとCocoaの入り口までご案内することを目指しています。

ご注意  このサイトに書かれているサンプルコードの実行はあなたの自己責任において行ってください。このサイトおよび私は、このサイトのサンプルコードの実行によって発生するいかなる損害にも責任がなく保証もいたしません。

2006年9月8日修正
2006 / Jul / 23
コマンドラインツールの作成と実行
では、さっそくはじめましょう。
Xcode を起動して「ファイル」メニューから「新規プロジェクト」を選びます。表示される新規プロジェクトアシスタントウィンドウで「Standard Tool」を選びます(図13)。Xcode 2.x では図のように「Command Line Utility」項目の中にありますが、Xcode 1.x では「Tool」という項目の中に入っていたように思います。項目別けはバージョンごとにかなりの頻度で変更されていますので、じっくりと探してみてください。

図13


次にプロジェクト名と保存場所を決めます。この例では前回と同じくデスクトップに作ったvivacocoaというフォルダの中に「func」というプロジェクト名で保存しています。コマンドラインツールの場合は GUI アプリケーションの場合と違い、英小文字でプロジェクト名を始めるのが慣習となっています。

図14


この Standard Tool は、その処理・操作の結果をユーザが目で確認できるプログラムの中で最もシンプルなC言語のテンプレート(ヒナ型)になっています。「完了」ボタンを押すとプロジェクトウィンドウが立ち上がります(図15)。

図15


 ツールバーの1番左に「アクティブターゲット」というポップアップメニューがあります。今はクリックしても「func (もしくはあなたが指定されたプロジェクト名)」しか選択できませんが、ここにターゲットというのを登録していけば、1つのプロジェクトファイルで複数の種類の違うプログラムを作ることができます。

 左側の「グループとファイル」項目の1番上(プロジェクト名の付いたXcodeのアイコン)をクリックすると、そのプロジェクトに含まれているすべてのファイルが右側の「ファイル名」に表示されます。

 右側の「ファイル名」には、アルファベット順に func、func.1、main.c が表示されています。
1. 「func」はプログラミング言語で書いたソースコードを機械語に直した実行ファイルです。まだ存在していないので赤色になっています。コンパイル(プログラミング言語で書かれたテキストファイルを機械語に翻訳する作業です)をして実行ファイルが出来上がると黒色に変わります。
2. 「func.1」は、UNIX のコマンドラインで man (マニュアル)を呼び出した際に表示されるテキストです。今回の例ではとくに必要はありません。一番右の「◎」の列のチェクボックスにチェックが入っています。ここにチェックの入っているファイルが現在のアクティブターゲットに含まれるファイルとなります。今回はチェックを外してもらっても、あるいはファイルを削除してもらっても構いません。例ではいちおうデフォルトのままにしています。
3. 「main.c」は、これから実際にコーディングを行っていくテキストファイルです。プログラミング言語はあくまでも人間が読めるテキストです。

 では、ここでは、何もコーディングせずにツールバーの「ビルドして実行」ボタンをクリックしてください。デフォルトのプログラムがビルドされて実行されます(図16)。

図16


実行ログ画面の1行目は、プログラムが実行された日付と時間を表示しています。
2行目は、このプログラム( main.c )で指示している「 Hello, world ! 」という文字列を表示しています。
空白行を空けての4行目は、「ステータス 0」でプログラムが正常に終了したことを表しています。
実行ログ画面を閉じてください。プロジェクトウィンドウで「 func (もしくはあなたが指定されたプロジェクト名) 」が黒色に変わっています。これは実行ファイルが存在していることを表しています。
2006 / Jul / 24
main関数
2006年7月30日修正:サンプルコードの引用部分に「i」という誤字が入っていたのを修正しました。

ソースコードを見ていきます。プロジェクトウィンドウ右側の「ファイル名」で「 main.c 」をダブルクリックしてください。ソースコードエディタが起動して次のコードが表示されると思います。

#include < stdio.h >

int main (int argc, const char * argv[ ]) {
    // insert code here...
    printf("Hello, World!\n");
    return 0;
}


空白行も入れて3行目を見て下さい。
int main (int argc, const char * argv[ ])
 この部分が main関数(メインかんすう) と呼ばれます。
C および Objective-C 言語では、最初にこのメイン関数が呼び出されてプログラムの実行が始まります。そしてこのメイン関数が終るときにそのプログラムも終了します。このことは GUI アプリケーションでも同じです。
 メイン関数も含めて関数で行うことは { } の間に書かれます。 { で始まり } で終ります。このように { } で書かれる文のことをブロック文と呼びます。また途中で return (サンプルでは6行目) に出会うとその時点でその関数の実行を終了して呼び出し元に戻ります。メイン関数の場合は最初の関数ですので return で元に戻るということはプログラムの終了ということになります。また return が無くても } でその関数は終了します。
 C および Objective-C では一つの命令が 1行に書かれるのではなく、 ; (セミコロン) が一つの命令( 式 )の区切りになります。一つの命令( 式 )が複数行にまたがっても構いません。
このサンプルの場合は、printf("Hello, World!\n");return 0; という2つの命令を実行していることになります。

printf("Hello, World!\n"); は、printf という関数を "Hello, World!\n" という引数 (ひきすう) をともなって実行することを命じています。このprintf関数の実行の結果、図16の「実行ログ」画面の2行目で「Hello, World!」と文字列が表示されているのです。
なお サンプルの1行目の #include < stdio.h > は、printf( )関数の定義が含まれているヘッダーファイルを読み込んでいます。プログラミングミスを防ぐために確かに存在する関数かどうかヘッダーファイルと照合してチェックしているのです。試しに1行目の #include < stdio.h > を削除して「ビルドして実行」を試してみてください。 incompatible implicit declaration of built-in function 'printf' (printfという組み込み関数の暗黙宣言、互換なし) というエラーもしくは警告が出ることでしょう。プロジェクトウィンドウの左側「グループとファイル」から「エラーと警告」をクリックするとエラーと警告の一覧を見ることができます。
註7. Xcodeは大変優れています。このようなヘッダファイルの読み込みミスはエラーや警告とならずに問題なくプログラムがビルドされるときもあります。
註8. 「エラーと警告」を見たあとに main.c などを見つけることができなくなったら「グループとファイル」の1番上、Xcodeのアイコンの付いているプロジェクト名をクリックしてください。プロジェクト内のすべてのファイルが表示されます。

return 0;return は関数ではなく C言語で最初から定められている 予約語 の一つです。呼び出し元に戻る際に、その関数で定めた返り値を返してからその関数を終了します。この例のメイン関数の場合は int値 (整数値) を返す事になっていますので、0 を返しています。通常、プログラムが正常に終了した場合は0を返すのが慣習となっています。システム(OS)側は 0 が返ってくれば正常終了したのだと分かり、そのほかの数値が返って来た場合はそれに合せた対応をとることができるようになります。 今回のサンプルでも、図16の「実行ログ」画面の最後の行で「func はステータス 0 で終了しました。」と受け取った数値を表示しています。
 なお、 return などの予約語については、 C言語 予約語 一覧 で詳しく説明しています。ご欄になってください。

最後に 4行目の // insert code here...コメント行 と呼ばれ、コンパイル時(機械語へ変換するとき)に完全に無視されプログラムに一切影響を与えません。 プログラマがソースコードの覚え書きとして、そのコードの意味や注意点などを書くためのものです。
// のあとからその行の終わりまでがコメントとして扱われる一行コメントと、/* と */ の間に書かれた文字列(複数行も可)がすべてコメントとして扱われる書き方があります。
2006 / Jul / 24
関数の特性
2006年7月30日修正:サンプルコードの引用部分に「i」という誤字が入っていたのを修正しました。

関数の説明を続けます。
「Happy Macintosh Developing Time Second Edition」でメッセージの特性が説明されていますが、この説明はそのまま関数の説明にもあてはまります。

関数は複数の値を伴うことができます。この値を引数(ひきすう)と呼びます。
引数は printf("Hello, World!\n"); のように ( ) の中に記述します。

関数は値を返すことができます。この値を 返り値 (かえりち) もしくは 戻り値 (もどりち) と呼びます。
前述のmain関数では最初の int が整数の値を返すことを表しています。
int main (int argc, const char * argv[ ])

では、この main関数を色々と変更してみましょう。

#include < stdio.h >
/* 返り値を返さない main関数です */
main (int argc, const char * argv[ ]) {
    printf("Hello, World!\n");
    return 0;
}

1. 1行目の #include < stdio.h > は、また書き加えておきます。
2. 2行目に /* */ 型のコメントを書いてみます。
3. 3行目の main関数の返り値 int を削除します。
4. 4行目の // insert code here... は1行全部削除します。
では、この状態で「ビルドして実行」を試してみましょう。
warning: return type defaults to 'int'(警告: リターンタイプは'int'をデフォルトとします。)という警告は出ますが、無事に実行されて「 Hello, World! 」と表示されて ステータス 0 も返ってきます。

では、今度は return で返す値を 10 に書き換えて「ビルドして実行」をします。
註9. 10と青色にしているのは分かりやすさのためです。実際に青色にする必要はありません。ただしXcodeの初期設定でソースコード上の数値は青色で表示されるようになっているかもしれません。

#include < stdio.h >
/* 返り値を返さない main関数です */
main (int argc, const char * argv[ ]) {
    printf("Hello, World!\n");
    return 10;
}

今度もまた、warning: return type defaults to 'int'(警告: リターンタイプは'int'をデフォルトとします。)という警告は出ますが、無事に実行されて「 Hello, World! 」と表示されて ステータス は指示通り 10 が返ってきます。

では、今度はmain関数の引数を空にしてみましょう。そしてprintf関数の引数は"Viva Cocoa!"に変えてみましょう。 return 10; の行は削除します。

#include < stdio.h >
/* 返り値を返さない
そして引数も持たない main関数です */
main ( ) {
    printf("Viva Cocoa!");
}

warning: control reaches end of non-void function(警告:値を返さないまま関数の最後に達しました)という意味の警告が加わりますが、無事に Viva Cocoa! と表示されます。また、適当なステータスナンバーも返されています。

では、最後に return0 を返すように戻します。「ビルドと実行」をクリックすると下記のような「実行ログ」画面が表示されると思います(図17)。

#include < stdio.h >
/* 返り値を返さない
そして引数も持たない main関数です */
main ( ) {
    printf("Viva Cocoa!");
    return 0;
}


図17

右下の赤丸の部分にはエラーと警告の数が表示されます。図17では警告が1つあることを表しています。この部分をクリックしても「エラーと警告」の一覧を見ることができます。なお、エラーは1つでもあればプログラムはビルドされません。
2006 / Jul / 24
Column
関数、サブルーチン、メソッド、
C言語が登場するまでは引数を受け取り何かの仕事をして値(答え)を返すものが関数でした。それに対して何かの仕事はするが値は返さないものをサブルーチンと呼んでいました。しかしこれは C 言語の登場で一変することになります。C 言語では引数を渡して仕事をしてもらっても返り値として値を受け取る必要がなくなったからです。それがポインタの登場です。ポインタについては、また後の回で詳しく説明しますが、以来、返り値のあるなしに関わらず何かの仕事をするものを関数と呼ぶようになり、オブジェクト指向型言語ではメソッドと呼ぶようになりました。ただしC++ではメンバ関数と呼んでいます。これから勉強しようとしているObjective-Cではメソッドと呼んでいますが、Objective-CはC言語を完全に内包していますので、C言語の関数も使うことになります。
  上記のサンプルでmain関数は、冒頭に int (整数値を返す)と明示されていなくても値を返していることが分かりましたが、このことが「値を返さない関数の正当性の証明になっている」というロジックを呼んだ記憶があります。

プロシージャー
関数、メソッド、サブルーチンなどのすべてを表す言葉だと思います。プロシージャーという言葉が使われはじめたのはBasicの頃からだと聞いています。

ルーチン、メインルーチン
ルーチンと呼ぶとおおむね関数・メソッドのことを指しているみたいです。メインルーチンと呼ぶと C言語では main関数のことになるみたいです。
第2回へ 第4回へ 目次へ