第2章 Xcodeを使ったC言語の学習
パート1:Macのコマンドラインアプリケーションを作成する
先の章で説明したように、iPhone/iPad/iPod TouchアプリケーションはXcodeを使い作成します。
プログラム記述に使用する言語はObjective-Cというものです。
C言語
Objective-C言語は、その祖先であるC言語の理解を前提としています。
まずはC言語によるプログラミングから学習しましょう。ここでは、実際にXcodeでC言語を使いアプリケーションをプログラミングしてみます。
このドキュメントを読み、頭の中でシミュレーションしていくのでもかまいませんが、Xcodeを使い、実際に学習する方法をお勧めします。
Xcodeの準備方法がわからない人は、以下のリンクを参考にしてください。
(1)iPhone/iPadアプリケーションを作るには?
→無料開発者登録
Xcodeの準備方法がわからない人は、以下のリンクを参考にしてください。
(1)iPhone/iPadアプリケーションを作るには?
→無料開発者登録
作成するアプリケーションはiPhone/iPad/iPod Touch用ではなく、Macコマンドライン用です。
コマンドライン
コマンドライン用アプリケーションは、昔、コンピュータが文字列しか表示できなかった頃から存在するアプリケーションで、機構がシンプルな分、学習に集中できるからです。
ターミナル
現行のMacではターミナルというアプリケーションを通して、このコマンドライン用アプリケーションを利用できるようにもなっています。
![テン*シー*シー-1](https://stat.ameba.jp/user_images/20120111/09/xcc/74/93/j/o0065009611728640424.jpg?caw=800)
ターミナルはアプリケーションフォルダのユーティリティフォルダに入っています。
Spotlightに
ターミナル
と入力しても見つかります。
![テン*シー*シー-2](https://stat.ameba.jp/user_images/20120111/09/xcc/e1/c8/j/o0359012811728640425.jpg?caw=800)
ターミナルを起動するとウィンドウが1つ表示されます。
![テン*シー*シー-5](https://stat.ameba.jp/user_images/20120111/10/xcc/e6/8f/j/o0303021411728643429.jpg?caw=800)
このウィンドウ上で、コマンドライン用のアプリケーション名を打ち込み、最後にEnter(Return)キーを押せばその名前のアプリケーションが実行されます。
例えば半角英数の小文字で
ls すべて小文字です。LSやLsとしてはいけません。
と打ち込み、最後にEnter(Return)キーを押せば、自分のホームフォルダに置かれたフォルダ名のリストが表示されます。
![テン*シー*シー-3](https://stat.ameba.jp/user_images/20120111/09/xcc/1d/33/j/o0533020511728640426.jpg?caw=800)
半角英数
メニューバーの言語アイコンを"英字"にして入力するアルファベットや数字の事です。
![テン*シー*シー-4](https://stat.ameba.jp/user_images/20120111/10/xcc/ec/82/j/o0302006211728643414.jpg?caw=800)
表示されるフォルダ名が、Finderで表示されているものと違う点に注目してください。
![$テン*シー*シー-6](https://stat.ameba.jp/user_images/20120111/10/xcc/3c/33/j/o0519040911728649210.jpg?caw=800)
これはFinderが、各フォルダをユーザーの母国語に変換して表示しているためです。本当の名前は、このターミナルで表示された方です。
プログラムでフォルダやファイルを指定する時は、本当の名前を使う事になります。
ディレクトリ
また、フォルダという呼び名自体もFinderで用意されたものであり、プログラムではディレクトリという呼び方を使います。
ディレクトリとは名簿という意味です。MacのOS(OS X)やiOSでは、ルートディレクトリという、名前が
/
の最上位ディレクトリから始まって木構造を構成しています。
パス文字列
そしてルートディレクトリから各階層のディレクトリ名を「/」(スラッシュ)で結ぶ事で、特定のディレクトリやファイルを指定します。この特定のディレクトリやファイルまでの道順を示す文字列をディレクトリパス文字列、ファイルパス文字列などと呼びます。
/Users/kunii/Library ルートディレクトリからLibraryディレクトリまでの道順を表現する。
![$テン*シー*シー-7](https://stat.ameba.jp/user_images/20120111/10/xcc/d9/70/j/o0504022911728649209.jpg?caw=800)
ディレクトリの作り方や、ファイルの作り方は本編で学習します。
ここでは、Finderで見慣れたフォルダは、プログラムの視点からはディレクトリと呼ぶ事、各階層のディレクトリ名をスラッシュでつないで特定のディレクトリを指定できる事を覚えておく程度でかまいません。
コマンドライン用アプリケーションの作成
先ほどのターミナルでは、ディレクトリの一覧を表示する、lsというコマンドライン用アプリケーションを実行しました。
これはOS(今回ならMac OS X)が、アプリケーション(ls)をメモリ内に読み込み、サブルーチンとして実行したと考えて差しつかえありません。
![$テン*シー*シー-8](https://stat.ameba.jp/user_images/20120111/10/xcc/c4/62/j/o0536019411728652859.jpg?caw=800)
これから私たちが作るアプリケーションも、OSに読み込んでもらい、サブルーチンとして実行してもらう必要があります。では、C言語では、どのように記述すればサブルーチンや処理、引数を定義できるのでしょうか?
関数
C言語では以下のようにサブルーチンを記述します。
void func(void)
{
}
{
}
これはfuncという名前の、何も引数を持たず、何もしない、何も戻さないサブルーチンをC言語で記述した例です。
戻さないと書いたように、関数は、関数の結果として、値をひとつ、呼び出し側に戻す事ができます。
![$テン*シー*シー-9](https://stat.ameba.jp/user_images/20120111/10/xcc/bb/ac/j/o0540023411728654507.jpg?caw=800)
C言語では記述に半角英数を使う。全角スペースや全角の{}、()などは不可。
![$テン*シー*シー-10](https://stat.ameba.jp/user_images/20120111/10/xcc/de/93/j/o0395020511728655459.jpg?caw=800)
詳細は後で触れますが、もう少し複雑に2つの整数値を引数で受け取り、この合計値を戻す関数を定義するなら以下のように記述します。
int add(int a, int b)
{
return a + b;
}
{
return a + b;
}
この記述で、メモリ上には、以下のようなサブルーチンが用意されることになります。
![$テン*シー*シー-11](https://stat.ameba.jp/user_images/20120111/10/xcc/d1/60/j/o0548051411728660278.jpg?caw=800)
関数から関数を呼び出す時は以下のように記述します。
![$テン*シー*シー-12](https://stat.ameba.jp/user_images/20120111/10/xcc/57/91/j/o0459016411728660968.jpg?caw=800)
上記の例ではfuncという関数(サブルーチン)と、addいう関数(サブルーチン)を定義しています。
func関数では、add関数を第1引数aに10、第2引数bに5を設定して呼び出すという処理一つを記述しています。
この記述で、func関数からadd関数が呼び出され
10+5=15
という処理がおこなわれ、戻り値15を伴ってfunc関数に戻る(ただし、addの戻り値は何も利用していない)ようなプログラムが記述できた事になります。
![$テン*シー*シー-13](https://stat.ameba.jp/user_images/20120111/10/xcc/37/04/j/o0554034211728662324.jpg?caw=800)
main関数
あとは、このfunc関数をOSから呼び出してもらえれば、「10+5=15」を計算だけするアプリケーションが完成するわけですが、これには以下のようなC言語のルールがあります。
OS側から呼び出される関数はmainという名前の関数とする。
すなわち、funcという名前をmainにすれば、実行時に自動的にOSから呼び出してもらえるというわけです。
それでは実際にXcodeを使ってプログラミングしてみましょう。
Xcodeの起動
Xcodeはインストール時に特に指定しなければ以下の場所に配置されています。
/Developer/Applications
Finderの移動→フォルダへ移動…メニューで上記文字列を打ち込み移動してもかまいませんし
![$テン*シー*シー-14](https://stat.ameba.jp/user_images/20120111/10/xcc/4a/10/j/o0346036411728665367.jpg?caw=800)
ターミナルの時のようにSpotlightに
Xcode
と入力しても見つかります。
Xcode.app
図にXcodeではなく、Xcode.appと表示されているのは、私がFinderのFinder→環境設定メニューで出る画面の、詳細タグにある「すべてのファイル名拡張子を表示」にチェックを入れているからです。
![$テン*シー*シー-15](https://stat.ameba.jp/user_images/20120111/10/xcc/78/0d/j/o0340025811728667474.jpg?caw=800)
拡張子
Xcode.appなら.appの部分をこのように呼びます。
上記のチェックが付いた状態でアプリケーションフォルダを開くと、メールやiTunesなどすべてのアプリケーションに.appが付いているのがわかるでしょう。
この「すべてのファイル名拡張子を表示」は、アプリケーションに付く.appのように、Finderがユーザーに見せないようにしている拡張子があり、その、すべての拡張子を無条件に表示させる指定です。
Xcodeでは、テキストファイルを拡張子で分類し
という拡張子が付くファイルがC言語が記述されたテキストファイル。
という拡張子が付くファイルが、Objective-C言語が記述されたテキストファイル、というように区別します。
.cや.m拡張子は、チェックをしてなくても表示されるので、あまり気にしなくてもいいのですが、プログラムでファイルやディレクトリを指定するさいは、拡張子の存在を無視できないので、トラブルを避ける意味でチェックしておいた方がいいでしょう。
図にXcodeではなく、Xcode.appと表示されているのは、私がFinderのFinder→環境設定メニューで出る画面の、詳細タグにある「すべてのファイル名拡張子を表示」にチェックを入れているからです。
![$テン*シー*シー-15](https://stat.ameba.jp/user_images/20120111/10/xcc/78/0d/j/o0340025811728667474.jpg?caw=800)
拡張子
Xcode.appなら.appの部分をこのように呼びます。
上記のチェックが付いた状態でアプリケーションフォルダを開くと、メールやiTunesなどすべてのアプリケーションに.appが付いているのがわかるでしょう。
この「すべてのファイル名拡張子を表示」は、アプリケーションに付く.appのように、Finderがユーザーに見せないようにしている拡張子があり、その、すべての拡張子を無条件に表示させる指定です。
Xcodeでは、テキストファイルを拡張子で分類し
.c
という拡張子が付くファイルがC言語が記述されたテキストファイル。
.m
という拡張子が付くファイルが、Objective-C言語が記述されたテキストファイル、というように区別します。
.cや.m拡張子は、チェックをしてなくても表示されるので、あまり気にしなくてもいいのですが、プログラムでファイルやディレクトリを指定するさいは、拡張子の存在を無視できないので、トラブルを避ける意味でチェックしておいた方がいいでしょう。
新規プロジェクト作成
まずはXcodeを起動し、表示されるWelcome画面のCreate a new Xcode projectボタンを押して(File→New→New Project…メニューを選ぶのでもかまいません)ください。
![$テン*シー*シー-16](https://stat.ameba.jp/user_images/20120111/10/xcc/2c/62/j/o0473031011728669071.jpg?caw=800)
プロジェクトテンプレート選択ウィンドウが現れるので、Mac OS Xの Applicationタグを選び、Command Line Toolテンプレートを選んでNextボタンを押します。
![$テン*シー*シー-17](https://stat.ameba.jp/user_images/20120111/10/xcc/d1/79/j/o0491032211728669626.jpg?caw=800)
次に現れる設定画面では、作成したいアプリケーションの名前を指定します。今回は
study
とします。その下のCompany Identifierはブートキャンプでの学習では特に意味を持ちません。適当に
jp.edu
とします。
TypeはCを選んでください。
Use Automatic Reference Countingはブートキャンプでの学習に関係ないのでチェックを外します。
![$テン*シー*シー-18](https://stat.ameba.jp/user_images/20120111/10/xcc/31/df/j/o0531043111728670734.jpg?caw=800)
そこまでできたらNextボタンを押し、次の画面でプロジェクト作成場所を指定します。
今回はディスクトップを選びました。
Create local git repository for this projectはブートキャンプでの学習に関係ないのでのチェックを外します。
![$テン*シー*シー-19](https://stat.ameba.jp/user_images/20120111/10/xcc/15/37/j/o0452026611728671511.jpg?caw=800)
Createボタンを押すと、ワークスペースウィンドウが表示されます。
ワークスペースウィンドウ
左のエリアにリストされているmain.cをクリックして選ぶと、さきほど説明したmain関数が記述されたC言語ソースの内容が表示されます。
![$テン*シー*シー-20](https://stat.ameba.jp/user_images/20120111/10/xcc/9d/3d/j/o0569038511728672919.jpg?caw=800)
右のUtilitiesエリアが表示されて画面が狭いと思った人は、Hide or show Utilitiesボタンを押して閉じてもらってもかまいません。
そのまま、Runボタンを押すとアプリケーションがコンパイル、リンクされ実行されます。
![$テン*シー*シー-21](https://stat.ameba.jp/user_images/20120111/10/xcc/64/ec/j/o0358011811728674370.jpg?caw=800)
そして自動的にデバッグエリアが開き、実行結果がコンソールエリアに表示されます。
![$テン*シー*シー-22](https://stat.ameba.jp/user_images/20120111/10/xcc/3f/49/j/o0588040611728675153.jpg?caw=800)
コンソールエリアには
Hello. World!
の文字が出力されているはずです。
![$テン*シー*シー-23](https://stat.ameba.jp/user_images/20120111/10/xcc/54/ea/j/o0550019011728676124.jpg?caw=800)
これはテンプレートプロジェクトがすでに、画面に
Hello. World!
と出力するプログラムをmain.cに用意していたからです。
ターミナルでの実行
この時点で、コマンドライン用アプリケーションstudyは完成しています。先ほどのターミナルからも利用できるようになっているので、試してみましょう。
まず、作成されたコマンドライン用アプリケーションstudyのファイルをFinder上で表示させます。
左のリストのProductsという項目のディスクロージャ(左にある三角形)をクリックして中身を表示させてください。studyという項目が現れます。
そして、そのstudyをcontrolキーを押しながらクリックしてください。
するとメニューが現れるので、その中から"Show in Finder"を選びます。
![$テン*シー*シー-24](https://stat.ameba.jp/user_images/20120111/10/xcc/c1/69/j/o0550021711728677039.jpg?caw=800)
Finderで中にstudyというファイルを含んだフォルダが開かれます。
これが、今回作成したコマンドライン用アプリケーションstudyです。
![$テン*シー*シー-25](https://stat.ameba.jp/user_images/20120111/10/xcc/80/94/j/o0343024511728677642.jpg?caw=800)
次に、Xcodeはそのままにして、ターミナルを起動してください。
開いたウィンドウに、studyファイルアイコンをドラッグ&ドロップします。
![テン*シー*シー-26](https://stat.ameba.jp/user_images/20120111/10/xcc/9d/27/j/o0485026211728678607.jpg?caw=800)
ウィンドウに、以前説明したファイルパス文字列(ルートディレクトリからstudyファイルまでのパス)が表示されます。
![テン*シー*シー-27](https://stat.ameba.jp/user_images/20120111/10/xcc/76/18/j/o0458012311728678606.jpg?caw=800)
lsの時のようにEnter(Return)キーを押せばアプリケーションが実行されます。
![テン*シー*シー-28](https://stat.ameba.jp/user_images/20120111/10/xcc/c9/20/j/o0453013211728678608.jpg?caw=800)
実行すると画面に"Hello. World!"と出力するだけの単純なアプリケーションですが、それでも立派なアプリケーションです。
Xcodeを使ってアプリケーションを作ることができました。
main関数の変更
少しstudyアプリケーションの動きを変更してみましょう。ターミナルはそのままにしてXcodeに戻ってください。そして先ほどのmain.cを再びクリックし、main関数の処理を少し変更します。
int main (int argc, const char * argv[])
{
if (argc > 1) printf("%s ", argv[1]);
printf("Hello, World!\n");
return 0;
}
{
if (argc > 1) printf("%s ", argv[1]);
printf("Hello, World!\n");
return 0;
}
メールやワープロで文章を書く要領で上の一行
if (argc > 1) printf("%s ", argv[1]);
を追加してください。すべて半角で入力します。
コード補完機能
初めてXcodeのエディタエリアで文字を書き込んだ人は、ifと書こうとして、i、f、と打ち込んでいくたびに携帯電話の文字補完のように単語候補が表示されるのに驚くかもしれません。
![$テン*シー*シー-29](https://stat.ameba.jp/user_images/20120111/10/xcc/e4/1f/j/o0420008111728681665.jpg?caw=800)
このように、Xcodeにはプログラマが入力したテキストと、それが入力された文脈の両方に基づき、入力しようとしている単語を完成させるための提案をおこなうコード補完機能があります。
初めてXcodeのエディタエリアで文字を書き込んだ人は、ifと書こうとして、i、f、と打ち込んでいくたびに携帯電話の文字補完のように単語候補が表示されるのに驚くかもしれません。
![$テン*シー*シー-29](https://stat.ameba.jp/user_images/20120111/10/xcc/e4/1f/j/o0420008111728681665.jpg?caw=800)
このように、Xcodeにはプログラマが入力したテキストと、それが入力された文脈の両方に基づき、入力しようとしている単語を完成させるための提案をおこなうコード補完機能があります。
フリーフォーマット
2行に分けて(ただし"%s "の部分を分けてはいけない)書いてもかまいません。
この命令に関してはスペースも本来、必要はありません。
C言語は、ある一定の規則さえ守れば、自分が見やすいように書いてかまわないようになっています。
これをフリーフォーマットと呼びます。
2行に分けて(ただし"%s "の部分を分けてはいけない)書いてもかまいません。
if (argc > 1)
printf("%s ", argv[1]);
printf("%s ", argv[1]);
この命令に関してはスペースも本来、必要はありません。
if(argc>1)printf("%s ",argv[1]);
C言語は、ある一定の規則さえ守れば、自分が見やすいように書いてかまわないようになっています。
if (argc > 1)
printf("%s " , argv[1]);
printf("%s " , argv[1]);
これをフリーフォーマットと呼びます。
変更したらRunしてください。
ただし、Xcodeでは特に何の変化もおこりません。
今度は、Xcodeはそのままにして、ターミナルのウィンドウを前面にして、キーボードから▲キーを押します。
![テン*シー*シー-30](https://stat.ameba.jp/user_images/20120111/10/xcc/15/1d/j/o0177003811728684126.jpg?caw=800)
ウィンドウにはさきほどのstudyファイルパス文字列が表示されるはずです。
![テン*シー*シー-31](https://stat.ameba.jp/user_images/20120111/10/xcc/05/56/j/o0458008511728684127.jpg?caw=800)
このように、ターミナルは最後に実行したコマンド行を再現できるようになっています。
ここでEnter(Return)キーを押せば、先ほどと同じです。ただし、今回はEnter(Return)キーの前に以下の文章を追加します。
![テン*シー*シー-32](https://stat.ameba.jp/user_images/20120111/10/xcc/b5/bd/j/o0406011211728684125.jpg?caw=800)
![$テン*シー*シー-32](https://stat.ameba.jp/user_images/20120111/10/xcc/7b/98/j/o0244006511728685514.jpg?caw=800)
追加できたらEnter(Return)キーを押してください。
myname Hello, World!
と表示されたなら成功です。
![$テン*シー*シー-33](https://stat.ameba.jp/user_images/20120111/10/xcc/10/13/j/o0482012711728685515.jpg?caw=800)
ターミナルは、アプリケーションに追加情報の文字列をOS経由で渡せるようになっていて、アプリケーションにはmain関数の引数として渡ってくるわけです。
studyアプリケーションは、OSから受け取った引数を利用するアプリケーションになりました。
次回は、この仕組みを学習していきましょう。
疲れた人はXcodeを終了して休んでください。
いつでもディスクトップ上に作られたstudyフォルダ内のstudy.xcodeprojをダブルクリックしてXcodeを起動する事ができます。
![テン*シー*シー-34](https://stat.ameba.jp/user_images/20120111/10/xcc/51/f8/j/o0400026011728687481.jpg?caw=800)
今回作成したコマンドライン用アプリケーションのプロジェクトはstudyというフォルダ内にまとめられたmain.cとstudy.1というファイル、そしてプロジェクト本体のstudy.xcodeprojから構成されています。
また、study.1はターミナルでstudyの使い方を説明するためのファイルで、プログラミングとは直接関係ないので、実質main.cだけで作られるアプリケーションです。
![テン*シー*シー-35](https://stat.ameba.jp/user_images/20120111/10/xcc/c1/75/j/o0370010611728687480.jpg?caw=800)
いつでもディスクトップ上に作られたstudyフォルダ内のstudy.xcodeprojをダブルクリックしてXcodeを起動する事ができます。
![テン*シー*シー-34](https://stat.ameba.jp/user_images/20120111/10/xcc/51/f8/j/o0400026011728687481.jpg?caw=800)
今回作成したコマンドライン用アプリケーションのプロジェクトはstudyというフォルダ内にまとめられたmain.cとstudy.1というファイル、そしてプロジェクト本体のstudy.xcodeprojから構成されています。
また、study.1はターミナルでstudyの使い方を説明するためのファイルで、プログラミングとは直接関係ないので、実質main.cだけで作られるアプリケーションです。
![テン*シー*シー-35](https://stat.ameba.jp/user_images/20120111/10/xcc/c1/75/j/o0370010611728687480.jpg?caw=800)
→NEXT:(4)C言語ソースの解析1/2