• ベストアンサー

Cのmain関数の外出しした計算部分を別ファイルで読み込みたいのです

C言語でとある計算プログラムを作成しました。 mainの中でFileAを読込み、1行づつ同じ計算をFileAの最終行まで演算し、出力しています。 同じ計算をしている部分はmain関数の外で作っており、mainの中で呼び出しています。 出来上がったKeisan.cというファイルを、gccでコンパイルして、Keisan.exeというものにして、「./Keisan.exe FileA > ResultA.txt」といったコマンドで利用しています。 改修を進めていくうちにとても長いプログラムになってしまったので、main関数の外で繰り返し呼び出している部分を別のファイルにして呼び出せないものかと悩んでいます。 「Keisan.exe」から「KeisanhojoA.c(もしくは.exe?)」を呼び出して同じ計算結果としたいのですが、どうすればいいのかさっぱりです。 こういうことを解説しているwebサイト、または書籍をご存知でしたらご教示いただきたく。 今やっている処理を正式になんと言うか、また今回やりたいことはなんと呼ばれているものなのか分からないために、分かりにくい質問になってしまいましたが、よろしくお願いいたします。

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

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

C言語は関数に分割することで別ファイルに分けることが出来ます。 1.たくさんの関数にmainを分割する。まず1つのソースファイルに複数の関数を入れる。 http://www.f-kmr.com/clang/clang-2.htm http://www.geocities.co.jp/SiliconValley-Cupertino/3384/EnterC2.html http://daimaru.sakura.ne.jp/c_room7.html 2.それでも関数が多すぎたら、機能単位に別のファイルに分割する。 http://www-ise3.ise.eng.osaka-u.ac.jp/miura/programLecture/lecture4.html http://www.geocities.jp/ky_webid/c/032.html

mosimosi99
質問者

お礼

色々なサイトを教えていただき、ありがとうございます。 今回以外のことにも利用できるサイトで大変たすかりました。 ありがとうございました!

mosimosi99
質問者

補足

たくさんのリンクありがとうございます! とても参考になります。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

ファイルを分割したいということですね コンパイル時には呼び出す関数の戻り値と引数の型だけわかっていれば関数の実体はなくても出来ます リンク時に関数の実体をリンクできればいいです /* Keisan.c */ int Keisanhojo(int); int main(int argc, char**argv) { int a, b = 0; a = Keisanhojo( b ); return 0; } ------------------- /* KeisanhojoA.c */ int Keisanhojo(int var) { return var * 2; } $ gcc -o Keisan Keisan.c KeisanhojoA.c

mosimosi99
質問者

お礼

実例付きのお陰で、分割できました。 3つ以上に分けた場合も、並べて指定することで可能でした。 ありがとうございました!

mosimosi99
質問者

補足

実例付きでありがとうございます。 $ gcc -o Keisan Keisan.c KeisanhojoA.c このコンパイルで「Keisan.c」と「KeisanhojoA.c」の2つが合わさって「Keisan」というファイルになるわけですね? ということは3つのファイルを統合したい場合、以下のようでいいでしょうか? $ gcc -o Tougou.exe Keisan.c KeisanhojoA.c KeisanhojoB.c

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

現在は、Keisan.cという1個のファイルに、 main関数や他の関数を書かれているのですか? 何という関数があって、各関数はどういう機能を持っているかを 教えていただけますか?

mosimosi99
質問者

お礼

詳しいことを書けずに申し訳なかったです。 会社のPCを見ないとよく覚えていないというのが一番の問題なのですが・・・ せめて自分のプログラムくらい覚えているように努力します。 ありがとうございました!

mosimosi99
質問者

補足

そうです。main関数と一緒に他の自作関数を書いています。 mainの中では、FileA(1秒毎の数値)の読込み、自作関数の呼び出し、戻り値の整理をしています。 自作関数Aで、各秒時毎数値の判定計算をしてmainに0、1を返しています。 あまり詳しいことが言えなくて申し訳ないです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • [C言語] 関数を利用する計算

    年a% の複利で、b円借りて、c年後にすべて返済した場合の返済額を計算するプログラムを、関数を利用して作りたいのです。 a%でc年借りた場合の利息を計算する部分を関数とすると、 (1+r/100)^c なので、これを関数としてプログラムを組みたいのですが、 関数の使い方がいまいちわからなく、中々組めません。 main()から関数を呼び出し、その数値を返した値にbをかければ答えが出ると思うのですが、 main()から関数を呼び出す、というのはどういう風にかけばいいのでしょうか?

  • 初期化は、main関数の外で行うものなのか

     ルネサスHEWのサンプル・プログラムを見ると、I/Oの初期化、Bセクションのクリア、DセクションからRセクションへのコピーなどを行ってから、main関数に飛んでいます。  これらの初期化はメイン関数の中で行うべきだと思っているのですが、どうなんでしょう。  パソコンでexeファイルを実行した場合、mainに飛ぶと思っているのですが、初期化プログラムに飛んでからmainに飛ぶのでしょうか。  宜しくお願いします。

  • 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の場合の両方について、コンパイラがどのような順番でプログラムを処理しているのかを具体的に教えてください。 どうかよろしくお願い致します。

  • main関数の戻り値

    C言語のmain関数の戻り値はint型ですよね。 私もそういう決まりだと思って守ってきました。 しかし、「mainが戻り値を返すって、どこに返すの?」ということが、私は理解できていません。 私が調べたところでは、「ホスト実行環境」という言葉がこの問題に関係あるようですが、この言葉の意味はよくわからないですし、似た言葉で「ホスト環境」ということばがあるのですが意味も関係もわかりません。 これらは、OSとは違うと思うんですが、自信はありません。 それでも、ない知識を振り絞っていろいろ考えてみると、次のようなことらしいのですが、正しいでしょうか。 ・OSはプログラムの実行に先立ちホスト実行環境を作る。 ・静的記憶域のオブジェクトを初期化するのはホスト実行環境である。 ・関数が、main関数を呼ぶことは可能である。(以下では、main関数が関数から呼ばれる場合は除く。) ・main関数を呼ぶのは、ホスト実行環境が行なう。 ・main関数の中のreturnによってプログラムが終了するのと、exit関数でプログラムが終了することに違いはない。 ・main関数の戻り値は、ホスト実行環境に返される。 ・returnによってホスト実行環境に返される値は、int型である限りなんでもよい。 ・exitによってホスト実行環境に返される値は、int型である限りなんでもよい。 ・必ずexitで値が返されるならば、main関数の中にreturnはなくてもよい。 main関数からの戻り値をどうしようと構わないんだと思うんですが、皆さんの経験の中で、実例としてこういうふうに使われる、というのは何かないのでしょうか。 (ホスト実行環境に値が返される、といっても無視するのでは意味はないと思うのです。 その値の使用例としては、 0が返ってくると「プログラムは正常終了しました。」と表示するとか、0以外の値が返されると別のプログラムが走るとか、 そういうことだと思うんですが。)

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

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

  • C++ でファイルを消す関数(??)

    C++ でコンソールアプリケーションを作っています。 “Hello, world!” から数ヶ月しか経過していない,初心者です。 C++ で計算プログラムを組んでいて,計算の途中結果を一時的に保存するため ofstream ofs(計算結果を一時的に保存するファイル); のように,一時的に計算結果を保存するテキストファイルを生成しています。 計算を実行後には,このファイルには(ファイル管理の簡素化のため)消えておいてほしいのですが, C++ に特定のファイルを消す関数(?)などは,あるのでしょうか? 初心者につき,変な質問をしているかもしれませんが,ご教授いただければ幸いです。

  • C言語のpow関数の不具合

    linux(ubuntu)の上でgccを使っています。 powの関数がおかしいです。 pow(10,-1)を計算させると正しく1e-1が出力されます。 #include <math.h> #include <stdio.h> int main(void){ double x = -1; printf("%f",pow(10,x)); return 0; } 上記のプログラムを走らせると、 In function "main"; *****.c:(.text+0x2d):undefined reference to 'pow' collect2: ldはステータス1で終了しました。 というエラーメッセージがでます。 なぜかpow関数の中に変数を入れるとプログラムが動きません。

  • プログラム、関数の呼び出しについて(C++)

    プログラム、関数の呼び出しについて(C++) 私の知識では、関数を呼び出したいときは同一ファイル内に関数の内容(計算式等)が 含まれなければならないと思うのですが、 受け取ったプログラムではそれ(関数本文)が見当たりません。 他のファイルの関数を呼び出すことはできるのでしょうか?? また、呼び出せるのであればどのような表記がされているのでしょうか? 例など載せていただけると助かります。 企業の人が組んだプログラムを改造しなければならなくなったのですが、 私は全くの初心者なので理解できない部分がたくさんあって困っています。 見当違いな質問だったらすみません。 回答よろしくお願いします。

  • main関数の事についてお聞きします。

    Windowsのプログラムを書くとき、下のようにキッチリ戻り値や引数を書かなくてはならないのに int WINAPI WinMain( HINSTANCE hInstance, // 現在のインスタンスのハンドル HINSTANCE hPrevInstance, // 以前のインスタンスのハンドル LPSTR lpCmdLine, // コマンドライン int nCmdShow // 表示状態 ); C言語で書かれたプログラムは int main(int argc, char *argv[]) ではなく、 int main(void) や void main(void) または int main() や main() だけのモノなど、 いろいろです。 main関数は、関数なのに戻り値や引数を省略して書ける仕様なのは、なぜなのか? ちょっと疑問に思ったのでこちらにお尋ねしました。

  • C#で、Cのファイルポインタ(?)のような機能

    プログラムの初心者、かつ、C#の初心者です。  C言語では、ファイルポインタを関数から関数へ渡すことができると思うのですが、C# ではどのようにすれば良いのですか? C#を使っていますが、C言語のような構造でプログラムを書いています。  やりたいことは、ファイルポインタを渡しながら、各関数で、ドカドカと計算結果をファイル内に書いていくということです。  宜しくお願いいたします。