ちょっと先の未来クイズ第4問

またまたすみません。
プログラムを書くときに、

  void main (void)  

と、とりあえず最初にこれを書く、と覚えていて意味がわかりません。
小学生でも理解できるくらいに噛み砕いて説明をお願いします。

A 回答 (8件)

まず初めに、過去ログの探し方についてです。


http://oshiete.goo.ne.jp/ask/howto/search.html

実際に、このカテゴリーから「void main 戻り値 引数」で検索をすれば、今だと56件ほど返ってきます。その中でお勧めなのが、以下の3件でしょうか。(各レベルについては、私の独断と偏見によるものです。)

小学生レベル→
http://oshiete1.goo.ne.jp/kotaeru.php3?q=100506

初学者レベル→
http://oshiete1.goo.ne.jp/kotaeru.php3?q=487521

技術者レベル→
http://oshiete1.goo.ne.jp/kotaeru.php3?q=328994


あと、「小学生でも理解できるくらいに噛み砕いて…」についてですが、強いてあげれば以下のようにもなるかと。
例えば、「関数」という抽象的概念の具体例としてよくあげられるものに、「自動販売機」があります。もちろん、この中にも単にお金を入れておく容器や缶ジュースなどとは別に、お釣りがいくらなのかとか、缶ジュースの残りがいくつなのかをチェックするようなソフトウェアが入っているはずです。(最新のものだと、100円玉の裏表の模様まで、チェックするものがあるらしいですね。)
そのようなプログラムの動作の概略を、main関数を用いて簡単に表せば、以下のようになると思います。(あくまで、噛み砕いて説明しているからであって、厳密には全然違いますよ。というより、正確にはメーカーの人じゃないと分からないでしょう。)

缶ジュース main (120円)
500ml入りペットボトル main (150円)

もちろん、これをドラクエ風に書けば、以下のようにもなるかと。

HPがフルに回復 main (ベホマ)
メタルキングの剣 main (37000G)

余談ですが、パルプンテなども、内部ではおそらく乱数なんかを発生させているんでしょうね~。ゲームプログラミングの方は一度もしたことがないので、あくまで想像ですけど。
    • good
    • 0
この回答へのお礼

>HPがフルに回復 main (ベホマ)
>メタルキングの剣 main (37000G)

なんとなくイメージがわきました。
ご返答ありがとうございました。

お礼日時:2005/11/13 17:41

mac_resさんを見習って、私もまともに答えます。



プログラムが起動すると、スタートアップと呼ばれる一種の関数が呼び出されます。コンパイラによって、この関数名や処理の内容は少しずつ違いますが、だいたいの意味において、

void start(void)
{
 int argc;
 char **argv;
 ...
 /* 初期値付き変数の初期化 */
 /* 初期値なし変数のゼロクリア */
 /* コマンドライン引数を解析して、argcとargvを組み立てる */
 ...
 stdin = fopen("xxx", "r");
 stdout = fopen("yyy", "w");
 stderr = fopen("zzz", "w");
 ...
 exit(main(argc, argv));
}

最後に、mainを呼び出して、その返却値をexitに渡していますね。
ここで呼び出しているmainはプログラマが自分で用意しなければなりません。そして、ここで呼び出されているので、プログラマから見れば、最初にmain関数が呼び出されることになるのです。

ここで、mainの返却値(=exit関数の引数)がどのように使われるかは、コンパイラによって異なります。また、exit関数の結果として行われる終了処理がどのようなものになるかもコンパイラに依存します。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました。

お礼日時:2005/11/13 17:43

冷やかしばかりでもなんですし、すでに書かれている答えも列挙されてますので、場つなぎでも…


コマンドラインから、Cで書かれコンパイルされたプログラムが実行されるとき、main()が直接コールされる訳ではありません。
Cコンパイラはリンカ実行時にC Run Time (crt) Routineと呼ばれるプログラムが、main()開始前に呼び出されるよう実行ファイルを組上げます。
crtは、コマンドラインから引数をとり、
int main(int argc, char *argv[])としたときに、argc, argvが参照できるように値をセットしたり、
static int foo = 2;
のような初期化された変数に値をセットします。
準備ができた段階で、main()をcallします。
ですから、コンパイルするソースコードの中には、main()という関数が1つ必要です。
プログラムが、exit()を実行したり、main()からreturnした時には、crtはその戻り値をコマンドの戻り値としてshell(もしくはcmd.exe等)に戻す手はずをして終了します。
void main(void)のように正しい戻り値がセットされていないときのコマンドの戻り値は、不定です。

要約すると、Cのプログラムはcrtから始まりcrtはmain()をユーザーが定めたスターとアドレスとする決まりになっており、その戻りとはコマンドの戻り値となるので、
int main(void)
int main(int argc, char *argv[])
と書いてプログラムを始める必要があるのです。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました。

お礼日時:2005/11/13 17:42

ANSI-Cの規格では


hosted environmentにおけるmain()関数は0個または2個の引数を取り、int型の値を返す。
と定義されています。
何らかのOS上で動作するプログラムであれば
int main(void)
int main(int argc, char *argv[])
main(void)
main(int argc, char *argv[])
のいずれかです。

void main(void)が許されている理由は、free standing environmentでは値を受け取るべきOSが存在しないことがありえるからです。

> 小学生でも理解できるくらいに噛み砕いて説明をお願いします。
回答内容からキーワードを抜き出して、自分で調べる努力をしましょう。
小学生でも自分で調べることはできるはずです。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました。

お礼日時:2005/11/13 17:38

main は、プログラムの初期化部分から呼び出される最初のプログラム(関数)です。


main の前に付くのは、他の関数と同様に関数の返値で、
main の場合、アプリケーションとしてのシェルに対しての返値になります。その返値を使ってシェル(コマンドプロンプトとか)は、プログラムが正常に終了したのかどうかとか判断できます。
規格としてはそのために main はint を返すことになっていますが、
プログラマにとっては特に、シェルで値は利用しない、プログラムの実行だけできればいいというような意味で void にする場合があります。
その場合は、アプリケーションとしては、有意な値を返さないというような意味合いになりますが、main が void であっても、stdlib.hのexit関数を使うことで、値を返している場合があります。
また、プログラムとしては、有意な値を返さないとなっていても、シェルとしてはなんらかの値が返っている場合があります。

main の引数部分については、通常、シェルからの起動時の引数が渡されます。
void になっている場合は、そうした引数を利用しないということです。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました。

お礼日時:2005/11/13 17:38

プログラムを実行して最初に実行するブロックを示すためのもの,といえばわかりやすいですか?そこからメインの中だけだったり,ほかの関数を呼び出したりして処理を進めます.


今は,たいてい int main(int argc, char **argv) と書くんじゃないですかね.コマンドラインから引数を与えると, argc がさす先に引数が文字列で格納されます.
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました。

お礼日時:2005/11/13 17:37

> 小学生でも理解できるくらいに噛み砕いて説明をお願いします。



まちがっておぼえているので、もういちどよくべんきょうしなおしましょう。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました。

お礼日時:2005/11/13 17:36

とりあえず、


int main(void)
でしょ。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました。

お礼日時:2005/11/13 17:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報