Passing Arguments … — 理論を引き渡したりすると…

In the first three steps, every time you want to change the numbers, you’ve had to change the program, save it again (maybe with a different name), and compile it again. That’s a lot of work. Is there some way to avoid some of that?
これまでのステップでは、数字を変えようと、プログラム自体に手を加えて、違うファイル名をつけるかどうかを決めて、保存し直してから更にコンパイルすることになっていました。結構の手間かかるやり方ですね。そんな手間を避けられる方法無いでしょう?

As a matter of fact, yes. It’s called arguing with the computer.
もちろんあります。コンピュータと言い合いすることですよ。

Just joking. In computer jargon, “arguments”, or “parameters” are what you use when you want to specify that a part of the program can change. Think of the phrase,
さて、下手な冗談をやめれば、コンピュータ用語では「アーギュメント」というものがあります。他に、「パラメータ」、「母数」または「引数」と言うのです。これを使って、プログラムの一部を変更できることを指定できます。例えば、

Just for argument’s sake, let’s try this.
仮に、議論のため、「こんなこと」にしましょう。

Or think of setting parameters to your theory.
それとも、理論の特性値を決めることを考えましょう。

But don’t think too deeply. Not yet.
しかし、今は深く考えないでください。まだです。

Let’s look a little more carefully at the the declaration of the main function of the program:
プログラムの主関数の定義を、もうちょっと細かく見直しましょう。

int main(void)

“Void” means there’s nothing there. Well, let’s try putting something in there:
“Void” (「空」とか「無」とか)の意味は何もありません。では、何かをそこに取り付けておきましょう。

int main( int argCount, char * arguments[] )

Hmm. What have we here? It looks like getting into a count of complaints, or maybe arguments. And then theres a brace of charred arguments.
ウン、何だろうこれ?文句とか、議論の数?それに、黒焦げの文句を組み合わせた何とか…

Well, I didn’t claim to be much of a comedian. And those aren’t braces, they’re brackets. Braces are the curly ones. But, as a matter of fact, there is an argument count, and an array of arguments in there. The count is an integer, and the arguments are strings of characters.
やっぱり、漫才師じゃダメ、ね。でも、実状、アーギュメント(引数)の数がありますし、アーギュメントのかたまりもあります。数は整数です。引数(パラメータ)は文字を繋いだ文字列の配列にした塊です。ちなみに、あの括弧は「ブラケット」 (“bracket”) と言います。

Now that we have them, how do we use them? Here’s one way:
そして引数なんてあれば、どう使いましょう?こういう感じで使えます。

if ( argCount > 2 )
{
double a = strtod( argv[ 1 ], NULL, 0 );
double b = strtod( argv[ 2 ], NULL, 0 );
printf( “%g * %g == %g\n”, a, b, a * b );
}

And you need to
それに

#include <stdlib.h>

up above.
をその上の方に書く必要あります。

And now you’re scratching your head and saying, “That looks like a lot more trouble!”
頭傾げて「面倒そう!」のように、ブツブツつぶやいていらっしゃるのではませんか。

But when you save it as “multiply.c”, and compile it with,
しかし、”multiply.c” といファイル名で保存して、

cc -Wall -o multiply multiply.c

you can use it like this:
と、コンパイルしておけば、

./multiply   7.345334   3.1415927<enter>
7.34533 * 3.14159 == 23.076

のように使えます。

Hmm. It does a bit of rounding for us. Let’s see if we can fix that:
ええっと、四捨五入してくれていませんか?そうですね。もうちょっと手をつけてみましょう。

printf( “%.9g * %.9g == %.9g\n”, a, b, a * b );

And now it looks like this:
にすると、出力は

./multiply 7.345334 3.1415927
7.345334 * 3.1415927 == 23.0760477

のようになります。

Okay, so does that look a little more useful, maybe?
あれ?もうちょっと便利そうに思いませんか?たぶん?

Here’s the source. (I’m going to let you fix the comments yourself.)
ソースコードはここです。(コメントは任せます。)

Explanations:
解釈:

#include <stdlib.h>

Gives us access to some more useful stuff, like “strtod()” and “EXIT_SUCCESS”.
とは、更に便利な物々を利用可能にする宣言です。その中には “strtod()” と “EXIT_SUCCESS” のようなものがあります。

if ( <condition> )
{ stuff();
}

Allows the program to do “stuff()” only if <condition> is satisfied. The braces allow more than one “stuff()” to be based on the <condition>.
によって、プログラム処理上、 <condition> を条件に “stuff()” を行うような判断ができます。中括弧のブレースは複数の “stuff()” を <condition> の条件に基づいて行うのを可能にします。

strtod( <text-string>, <text-pointer> )

collects numeric text from the front end of <text-string> and converts it to a floating point number (like a decimal fraction).
を使って、数字の文字を文字糸、つまり文字列の先端からまとめて、浮動小数型の数値に直します。

arguments[ 1 ]

is a (pointer to) the text string of the first command-line argument, 7.345334 in the above case.
とは、最初のコマンドライン引数(上記の場合の 7.345334) を指すポインタです。

NULL

in this case, is an empty argument for when you don’t care where the conversion stopped. (More on that later.)
この例では、変換がどこで止まったかは気にしない時の空引数です。(後に詳しく説明します。)

double a

declares “a” to be a double-precision floating point variable, a good place to remember the “7.345334” from the command line. So,
にすると、 “a” を、2倍の正確性の浮動小数点あり変数を定義します。コマンドラインの “7.345334” のような少数の数値を覚えることに適しています。

double a = strtod( arguments[ 1 ], NULL );

Sets up “a” as a place to keep the first command-line argument, “7.345334”, above.
これで “a” を、命令行の “7.345334” を覚える場所に設定します。

Phew! (Take a breath, contemplate the ceiling for a moment.)
一息。(一瞬、天井を熟考しましょう。)

Okay, “%g” is like “%f”, it allows us to print out floating point numbers. And
さて、 “%g” とは “f” のようなもので、少数を表示できるように指定します。そして、

“%.9g * %.9g == %.9g”

formats three floating point numbers to 9 places of precision. (Loosely speaking. We’ll be more precise later.)
とは、三つの少数の数値を九桁の正確性までに表示する形式を決める文字列です。(詳細は後に取り上げます。)

And, remember that

a * b

multiplies a by b.
は a を b に掛ける式であることを忘れないでください。

Now, don’t think too deeply yet. Compile it. Try different numbers. Maybe even try making programs for addition, subtraction, division, calculating the circumference and area of a circle, and such things.
さて、深く考えるのはまだです。コンパイルして、いろんな数値でテストしてみてください。また、足し算、引き算、割り算、そして円の周辺と面積などを計算するプログラムも面白いかも知りません。

And I won’t confuse you by pointing out that the printf() statement has parameters in it, too. No. I won’t tell you that. Not yet, okay?
それに、ね、 printf() にも引数が指定されることを指摘して惑わせてあげることなどはしません。イヤ、そんなことについて話するつもりありません。いいね?

By the way, if you want or need a good calculator now, I’ll remind you that bc is pretty good stuff.
ちなみに、よくできる計算機がもう、今必要なら、 bc  は結構できます。

man bc

reiisi について

Joel Rees is a sometimes English teacher and sometimes programmer working and living with his family in Japan.
ジョエルリースという者は場合によって英語講師、場合によってプログラマです。家族と共に日本に住んでいて、日本で仕事をしています。
You can find some of my projects at
ボクのプロジェクトのいくらかを
http://sourceforge.net/users/reiisi
and 及び
http://sourceforge.jp/users/reiisi/
にてご覧いただけます。

カテゴリー: C Primer, Computer Languages, Computer Programming, Computers パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です