ルギア君の戯言

雑多な記事。

第6章 小麦粉をちょうだい

リザード「今回の仕事は、この箱の中に入っているそうだ。」
ルギア君「えっ!? この箱はりんごが入っているんじゃないの?」
リザード「では、開けてみようか。魔法はここにあるよ。」
ルギア君, −,. (ファギクンジェルバ、フォーディルンジェルダ、ディクネジェ。)」


すると、箱がひっくり返って、中から紙っペらが出てきた。
その紙には

小麦粉がなかったのをすっかり忘れてた・・・。とってきてもらえないかな?

と書いてあった。


リザード「というわけだ。じゃあ、今回も箱を用意して小麦粉を入れて持っていってあげな。魔法はこれだ。」
ルギア君−    . (バゲージェ セタミッセケボセ イェ ペアク ダガ。)」
リザード「うん。」
ルギア君 −    . (セタミッセケボセ クセーガ ペン ジルン ドン シッゲマドタ)」


すると、プラスチックの箱が出てきて中に小麦粉が入った。


リザード「じゃあ、持っていってあげな。」
ルギア君「うん。」


・・・


キノガッサ「おっ、またまたありがとう。開けてみるね。」
ルギア君「うん。」
キノガッサ, −, . (ファギクンジェルバ、フォーディーンジェルバ、セタミッセケボセ。)」


すると、中から小麦粉が出てきてテーブルの上にばらまかれた。


ルギア君「ばらまいちゃっていいの?」
キノガッサ「うん。」

まとめ

さて、今回からは、変な議論は抜きにしてサクサクと進めていきましょう。


今回は数えられないものをいれるための箱についてです。
まず、"ざる"を思い浮かべてください。
次に"ペットボトル"を思い浮かべてください。
最後に"分厚いコンクリートでできた入れ物"を思い浮かべてください。


ざるにはリンゴを入れておくことができます。
ですが、水は入れておくことができませんよね。


ペットボトルは口が狭すぎてリンゴを入れることができません。
しかし、水を入れておくことができます。


放射性物質はざるに入れても、ペットボトルに入れても危険なため、分厚いコンクリートの入れ物に入れます。
コンクリートの入れ物には水やリンゴを入れておくこともできますが、持ち運びに不便なので日常的には使われません。


このように、C言語でも、箱の種類がいくつかあって、前に「数えられるものを入れる箱」を勉強しました。
今回は流れる水のような「数えられないものを入れる箱」です。
この他にもいくつかあります。

では、数えられないものを入れる箱を用意しましょう。
こう書きます。

    float flower_box;

あっ、flower は「花」ではなく「小麦粉」のことですよ。


物語りの呪文は 3.4kg の小麦粉を入れるようになっていますので、

    flower_box = 3.4;

で、3.4kg の小麦粉が入ります。
それを、ばらまく(画面に表示する)魔法は

    printf("%f\n", flower_box);

で %d の d が f になってますね。



ところで、物語ではキノガッサからメッセージをもらいました。
このことは実際にできます。
まず、

    int main(void) {

のところを

    int main(int argc, char* argv[]) {

に変えてください。
ちなみに、本によっては

    int main(int argc, char** argv) {

と書いてあることもあります。もちろん、おなじ意味です。
深い意味はまた後で教えます。


こうすることで、キノガッサからのメッセージを受け入れる体制ができます。

    printf("%s\n", argv[1]);

とすると、メッセージの内容をそのまま画面に表示できます。

argv[1] の 1 をいろいろ変えて試してみてください。


で、できたプログラムは


<Sample01-004.c>

#include <stdio.h>

int main(int argc, char* argv[]) {
    float flower_box;
    printf("%s\n", argv[1]);

    flower_box = 3.4;
    printf("%f\n", flower_box);
    return 0;
}

となります。


箱を用意する魔法は、たくさん箱を用意する時に、あっちこっちにちらばっていると、困るというためか、最初に書くという決まりになっています。
(最近は寛容になってはいますが。)


ビルドしたら実行してみましょう。

Visual C++ 2005 の場合 *1

[プロジェクト]→['Sample01-004'のプロパティ]を開いてください。
[実行]のところにある[実行時引数*2]に

"小麦粉を持ってきてね キノガッサより"

と書いて OK を押してください。


ダブルクオーテーションも忘れずに。


ためしに、ダブルクオーテーションをはずしてみるのもいいかもしれません。


これをいろいろ変えてやってみてください。

Mac OS X, Linux の場合
$ Sample01-004.out "Please give me some flower, won't you? -Breloom"

とすると、実行できます。


日本語が入力できる場合は日本語でも入力してみてください。


この結果は


argv[0] → Sample01-004
argv[1] → Please give me ... -Breloom


ダブルクオーテーションをはずすと、


argv[0] → Sample01-004
argv[1] → Please
argv[2] → give
argv[3] → me
...
argv[8] → -Breloom


となるかとおもいきや、

>

とだけでてくるとおもいます。(場合によっては違うかも)


これは won't の ' が原因です。


' とだけ打ってエンターキーを押すと、進みますが、


7 や 8 を設定しているとエラーになります。


argv[0] → Sample01-004
argv[1] → Please
argv[2] → give
argv[3] → me
...
argv[6] → wont you? -Breloom


ですから。
最後は、' ' で囲まれた (ダブルクオーテーションとおなじ効果)ようになってます。

*1:今現在入っていないため、記録での手順です。実際と異なる可能性がありますのでご注意ください。

*2:引数は「ひきすう」と読むそうです。僕は「いんすう」で慣れちゃったのでいつも「いんすう」と読んじゃいます。僕としては基本的に好きなように読んでもいいと思いますが、「ひきすう」じゃないと変換できないのでご注意ください。