2009/11/14

Indirection


今日はIndirectionについて書こうと思う。 
Learn Objective–C on the Macによると、「あなたは友人Aから本を借りていた。しかし、その友人は遠いところに住んでいるので返しに行くのが面倒。そんな時、隣人がAの住んでる近くまで出かけると言う。あなたは隣人にAの本を返すようにお願いした。それがIndirectionだ」と書いてあった。

つまり、、、人に頼んで自分の仕事をやらせるっていう解釈の良いのかな。
かなりの参考書を読んでみたが、それに該当するような表記が見当たらない。。。
次回のゼミの時に先生と相談しよう。


そんな中でのサンプルコード03.01 Count-1の解析。


 
プログラム自体は単純なforループで、コンソールに表示した回数を文字列で表示するもの。
ここでいう%dがキーポイントになるそうだ。ここでfor文の終了値を5から10に変えるとコンソールに表示される値も10になる。(最初のNSLogも表記を変えるために変更しておく。)
さらに、このfor文で使っている値をあらかじめint型で定義しておく事でも同じ事ができる。表示する部分は直接何も変更していないが、 それ以前の定義を変える事で出力結果も変わった。つまり、こんなとても簡単なプログラムの中でIndirectionを使っているといえるのだ。


次に、配列の文字列を読み込んでその文字数をカウントするプログラムを解析した。配列を定義してそこから文字列を読み込むものと、テキストファイルから読み込むものがあったが、今回はテキストファイルから読み込む方をピックアップしようと思う。

まずはテキストファイル。



このファイルがプロジェクトファイルと同じディレクトリに格納されてる。
内容を編集するとプログラムにも反映される。それを示すためにtomonariという内容を加えた。

そしてソースコードは以下の通り。



FILE *wordFile = fopen ("/tmp/words.txt", "r");で読み込みたいファイルを指定し、char[100]で100文字まで読み込める配列を宣言。
fgetsfgets(word, 100, wordFile)というwordFileから文字列を読み込んでwordに格納する処理をwhileの条件とし、その中では読み込んだ文字列数から1を引く処理をしている。それは、改行文字も1文字として認識されてしまうためだ。
そして最後に文字列とその文字列をコンソールに出力する。



こういった処理がIndirectionによるものだと言えるそうだ。
また、ファイル名をプログラム内で定義しないでも同じ処理が行えるものが紹介されていた。


変更した点は青く選択された部分だけ。
まず始めに、このプログラムは何を行うものか説明したいと思う。
argcの値が1の場合は「you need to provide a file name」というメッセージを表示し、そうでない場合はargv[1]に含まれる名前のファイルを開く処理を行う。それ以降は前のプログラムと同じものだ。

さて、ここで注目すべき点はargcとargv[1]という項目である。
この2つは最初のmain関数の定義の際に定義されているが、これらは何者なのだろうか。

これは前から気になっていたが放置していた項目の1つだ。
ネットで調べてみると、C系のプログラミング言語では共通してこの項目を使っているようで 、argvはプログラムが実行する際に読み込むファイルを格納するための配列、argcはその要素の個数を示すという。argv[0]にはプロジェクトを作成した際にデフォルトで実行ファイルの名前が入るが、それ以降については自分で設定できる。つまり、ここで読み込みたいテキストファイルを指定する事で先ほどのfopen()を使わないで済むのだ。

話を巻き戻すが、argc==1という事は配列argvに実行ファイル1つ以外格納されていないため、自分で設定しろという警告文を出していることになる。もしそうではなく何らかの項目が追加されているなら、argv[1]の内容が示すアドレスのファイルを開きなさい。といったポインタ的な考え型ができるのだ。

さっきからアドレスを指定だの何だの言っているが、それはXcodeで設定する事ができる。
右側のリストの「実行可能ファイル」を展開する事で表示される項目をダブルクリックする事で、次のようなウィンドウが表示される。


その中で引数のタブを選択して上の方の+マークをクリック。そして「/tmp/words.txt」を入力して作業は完了。
一般的な場合は分からないが、自分の場合はXcodeを再起動する事でこの設定が適用された。ちなみに「usr/share/dict/words」を追加してプログラム内で読み込み、表示させると辞書に含まれる全ての単語を読み込む事になり、エライ事になる。

この本ではこれ以降もIndirectionについて述べている。
さらに読み進めて行こうと思う。




0 件のコメント:

コメントを投稿