• ベストアンサー

C言語 関数の呼び出し関係について

C言語を習い始めてから、1ヶ月も経っていないんですが、長いプログラム(1万行くらい)の読解という課題が出ました。 読解を円滑に進めていくためのコツとして、「関数の大まかな呼び出し関係」を調べればよい、と学びました。 そこで質問させてもらいたいのですが、「関数の呼び出し関係を調べる」とは、具体的にどういうことなんでしょうか?関数が関数を呼び出しているんですか?? もうひとつC言語について質問です。 今回与えられたプログラムは1万行くらいあるのですが、そのうちmain関数は50行くらいしかありません。 これって、残り9950行はすべて、main関数の動作のためにあるんですか?? 以上、初歩的な質問かもしれませんが、ご指導願います。

  • felon
  • お礼率52% (12/23)

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> 「関数の呼び出し関係を調べる」とは、具体的にどういうことなんでしょうか? main関数から別の関数を呼び出して、そこからまた別の関数を呼び出して、というように、関数の呼び出し経路を樹形図のように書いてみれば、分かりやすくなるということです。 > 関数が関数を呼び出しているんですか?? はい、そうです。 > 今回与えられたプログラムは1万行くらいあるのですが、そのうちmain関数は50行くらいしかありません。 > これって、残り9950行はすべて、main関数の動作のためにあるんですか?? どんなプログラムかにもよりますが、概ねそう考えてよいでしょう。そうでないケースを説明すると混乱するだけなのでやめておきます。 初心者は手作業で呼び出し関係を調べた方がよいのですが、自分で調べた結果の答え合わせにDoxygenを使うと便利です。 http://www.doxygen.jp/ DoxyfileでCALL_GRAPHとHAVE_DOTをYESに設定すれば、関数の呼び出し関係の図が自動生成されます。(Doxygenの他にGraphvizをインストールするのをお忘れなく) http://www.doxygen.jp/config.html#cfg_call_graph

felon
質問者

お礼

早急に解答していただきありがとうございました。 記載URLも参考にさせてもらいます。

その他の回答 (1)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>関数が関数を呼び出しているんですか?? そうです、main が関数 hoge() と fuge() を呼んで、さらに hoge() が関数 boke() と poke() を呼んで。。。という関係を調べて、 おおまか(main側)から枝葉末節(呼出している関数が標準ライブラリのみ)の方向に調べるのが基本です。 >そのうちmain関数は50行くらいしかありません。 普通です。正常なプログラマであれば、長々と main ブロックを書いたりしません。

felon
質問者

お礼

早急な回答をありがとうございました。 おかげで理解が深まりました。

関連するQ&A

  • C言語で、自分で作った関数内で終了させるには

    C言語なのですが、自分でエラーチェックをする関数を作りました。 エラーを検出した時点でプログラムを終了させたいのですが、 どのようにすればいいのでしょうか? return 0; はmain関数を終了させるときに使うのはわかるのですが… 初歩的な質問かもしれませんが、よろしくお願いします。

  • C言語について。

    C言語プログラマとしては、スタートアップコードは・・・ ・自分が書いたプログラムを、直接動かすために必要なライブラリ ・それはコンパイル後、リンカによって追加されるライブラリこれは、 どういう意味でしょうか?分かりやすく教えていただけると幸いです。すみません。で、 以下のかぶくんまんさんの回答です。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11247611941 で、 C言語におけるプログラミングとは「main関数を書くこと」に他ならない。なぜ「main関数を書く」ことがC言語におけるプログラミングに他ならないのかと言えば、それは偏に「C言語のコンパイラはmain関数を呼び出すプログラムを生成するから」です。それがmain関数を求めるので結果的にmain関数がリンクされ、そしてmain関数が求めるままに他の関数もリンクされていくわけです。 で、その「main関数を呼び出すプログラム」こそが、C言語における「スタートアップコード」。 という回答で、main関数以降は、プログラマが書くのですよね?プログラマが関数をリンクさせる様なプログラムを書くということでしょうか?教えていただけると幸いです。すみません。 という所が分かりません。教えていただけると幸いです。すみません。以下のURL https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12247932542

  • C言語でmain関数でのreturnとexit

    C言語でmain関数でのreturnとexitは同等とされてますが、 それは『プログラムを呼び出した元の動作』も同じですか? 例えばshellやOSから見て、割り当てメモリ開放などの点で returnで終了したプログラムの後処理と exitで終了したプログラムの後処理は 全く同じになりますか?

  • C言語を記述するシートの書き方

    こんばんは。 現在C言語を学んでいるのですが、課題としてC言語のプログラムを書いてくるようにとプリントが渡されました。そのプリントはプログラムを書く欄として横に長い長方形の枠があって、左のほうには8ミリぐらいの間隔で点線が縦に3本引かれています。 プログラムは分かるのですが、これをどうこのプリントに書けばいいのか分かりません。「main」や「#include」といったものを点線内に書いて、他の処理は普通に残りの白い余白に書けばいいのでしょうか? お願いいたします。

  • c言語

    (c++ではなくC89準拠) c言語について質問 (1) 関数名()と関数名(void)は違う意味 (2) mainの引数の型は(void)か(int argc, char *argv[]) (3) K&Rは標準c準拠でmain()という表記があります ということは、(1)の関数名とはmain以外の関数名で、 main()とmain(void)は同じなんでしょうか。

  • C言語について

    C言語を少しかじっている初心者です。こんな私が何故か今年会社の新人にプログラミングを指導することになりまして。。。ですが、あまりにもわからないことが多すぎるので、どなたかお助けください。 質問。 (1)C言語で開発されるシステムって実際にはどういうものが多いのでしょうか。 (2)CはVBなどのように、フォーム昨日がないですが、操作画面はどうやって作るのでしょうか。 (3)単体プログラムを結合をさせる時は、作った関数をヘッダファイルにして、mainで呼び出すのでしょうか。 また、研修の最後に成果を見せてもらうために、新人でプロジェクトを組んで簡単なシステムを作ってもらおうと思っています。設計から仕様書作成、結合、テスト・・・と一通りの開発手順を体験させたいのです。 でどんなシステムを作ってもらおうか悩んでいます。1プロジェクト6人で開発日数は3日。コンパイラはlsic-86で、ファイル処理関係がいいのです。なるべく実用的なもので・・・と考えているんですが、なにか良いネタはないですかね。。。 質問ずくめで申し訳ありませんが、どなたかよろしくお願いいたします。

  • C言語

    課題なんですが、C言語で 「文字列と正数nをキーボードから入力して、1行n文字で改行するプログラム」 をつくりたいのですが、わかりません。どうすればよいのですか?

  • C言語 main関数とsum関数の記述順について

    はじめまして。 【苦しんで覚えるC言語】(Web版)でC言語を学んでいる初学者です。 【第1部:C言語基礎編】>【関数の作り方】>【自作関数を作る】の部分(http://9cguide.appspot.com/11-01.html#S2)でつまづいています。 下記のような、1から100までの数字の合計を表示するプログラムが例題として取り上げられています。 しかし、ここが理解できないので、次の【プロトタイプ宣言】に進めずにいます。 例題1  sum関数をmain関数の後に記述した場合(プログラムが実行されない)。 #include <stdio.h> int main(void) { return 0; } int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } 例題2  sum関数をmain関数の先に記述した場合(プログラムが実行される)。 #include <stdio.h> int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } int main(void) { return 0; } 例題1の場合、【まずmain関数を作り、次にsum関数を作りました。この場合、main関数を解析している段階では、sum関数は発見されておらず、従って、main関数の中では、sum関数を使うことは出来なくなってしまいます。】との説明がありますが理解できません。 コンパイラがどのような順番でプログラムを処理しているか理解できていないので分からないのだと思います。 例題1の場合と例題2の場合の両方について、コンパイラがどのような順番でプログラムを処理しているのかを具体的に教えてください。 どうかよろしくお願い致します。

  • 関数はあるがC言語で書けないプログラム

    数学的に関数はあるがC言語では書けないプログラムを 探しています。 関数自体は偶数か奇数(0以上の整数)を返す関数で しかしプログラムでは書けないというものです。 よろしくお願いします。

  • C言語の関数について困っています

    こんにちは。 C言語で、テキストファイルの行数を数える関数があれば教えて頂けないでしょうか。例えば、以下の3行を含んでいるテキストファイルを対象としたとすれば 123465789123456789 1234567981234579 987654321987654321 関数を実行すれば、3という数字が得られ、 123456  789 123546879  123 123  456789123   123456789123 というテキストファイルであれば、4という数字が得られる。そんな関数をご存知な方は私にご教授願えないでしょうか。どうぞよろしくお願いします。

専門家に質問してみよう