C言語でとある計算プログラムを作成しました。

mainの中でFileAを読込み、1行づつ同じ計算をFileAの最終行まで演算し、出力しています。
同じ計算をしている部分はmain関数の外で作っており、mainの中で呼び出しています。

出来上がったKeisan.cというファイルを、gccでコンパイルして、Keisan.exeというものにして、「./Keisan.exe FileA > ResultA.txt」といったコマンドで利用しています。

改修を進めていくうちにとても長いプログラムになってしまったので、main関数の外で繰り返し呼び出している部分を別のファイルにして呼び出せないものかと悩んでいます。
「Keisan.exe」から「KeisanhojoA.c(もしくは.exe?)」を呼び出して同じ計算結果としたいのですが、どうすればいいのかさっぱりです。

こういうことを解説しているwebサイト、または書籍をご存知でしたらご教示いただきたく。
今やっている処理を正式になんと言うか、また今回やりたいことはなんと呼ばれているものなのか分からないために、分かりにくい質問になってしまいましたが、よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

C言語は関数に分割することで別ファイルに分けることが出来ます。



1.たくさんの関数にmainを分割する。まず1つのソースファイルに複数の関数を入れる。
http://www.f-kmr.com/clang/clang-2.htm
http://www.geocities.co.jp/SiliconValley-Cuperti …
http://daimaru.sakura.ne.jp/c_room7.html

2.それでも関数が多すぎたら、機能単位に別のファイルに分割する。
http://www-ise3.ise.eng.osaka-u.ac.jp/miura/prog …
http://www.geocities.jp/ky_webid/c/032.html

この回答への補足

たくさんのリンクありがとうございます!

とても参考になります。

補足日時:2009/05/22 19:14
    • good
    • 0
この回答へのお礼

色々なサイトを教えていただき、ありがとうございます。

今回以外のことにも利用できるサイトで大変たすかりました。

ありがとうございました!

お礼日時:2009/05/26 20:44

ファイルを分割したいということですね


コンパイル時には呼び出す関数の戻り値と引数の型だけわかっていれば関数の実体はなくても出来ます
リンク時に関数の実体をリンクできればいいです
/* 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

この回答への補足

実例付きでありがとうございます。

$ gcc -o Keisan Keisan.c KeisanhojoA.c
このコンパイルで「Keisan.c」と「KeisanhojoA.c」の2つが合わさって「Keisan」というファイルになるわけですね?

ということは3つのファイルを統合したい場合、以下のようでいいでしょうか?
$ gcc -o Tougou.exe Keisan.c KeisanhojoA.c KeisanhojoB.c

補足日時:2009/05/22 19:10
    • good
    • 0
この回答へのお礼

実例付きのお陰で、分割できました。

3つ以上に分けた場合も、並べて指定することで可能でした。

ありがとうございました!

お礼日時:2009/05/26 20:43

現在は、Keisan.cという1個のファイルに、


main関数や他の関数を書かれているのですか?

何という関数があって、各関数はどういう機能を持っているかを
教えていただけますか?

この回答への補足

そうです。main関数と一緒に他の自作関数を書いています。

mainの中では、FileA(1秒毎の数値)の読込み、自作関数の呼び出し、戻り値の整理をしています。
自作関数Aで、各秒時毎数値の判定計算をしてmainに0、1を返しています。

あまり詳しいことが言えなくて申し訳ないです。

補足日時:2009/05/22 19:16
    • good
    • 0
この回答へのお礼

詳しいことを書けずに申し訳なかったです。

会社のPCを見ないとよく覚えていないというのが一番の問題なのですが・・・

せめて自分のプログラムくらい覚えているように努力します。

ありがとうございました!

お礼日時:2009/05/26 20:46

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルで種類を数える関数が無いのは何故?

エクセルで種類を数える関数が無いのは何故なんでしょうか?

エクセルで種類を数えるには、いくつかの関数を組み合わせるのが一般的ですよね?
直接数える関数が無いのは、訳があるんでしょうか?

Aベストアンサー

>>エクセルで種類を数える関数が無いのは何故なんでしょうか?

やっぱり、そういう関数が必要な方が全体からみたら少数派だと、エクセルの開発者たちが考えているからではないかと思います。
また、既存の関数を組み合わせたら、対処可能だから、無理して新しい関数を作る必要性もない、開発の優先順位が低いって判断もあるでしょうね。

私は、エクセルの表を作ったり、エクセルVBAでプログラムを作ったりしますけど、そういう関数が必要になったことが全くありませんし。

Qint main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、

#include <stdio.h>

void main(void){

}

と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )

と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。

Aベストアンサー

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。
int main(int argc, char *argv[])
int main(void)

但し、最新のC言語規格(通称C99)では、
<ISO/IEC9899:1999>
or in some other implementation-defined manner.
</ISO/IEC9899:1999>
となっているので、処理系が戻り値のvoidを認めていればvoidも可。
# 組込み系などで戻り値を使わない環境もあるためでしょうか。

なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、
voidは言語仕様的には正しくない。(でも動くものもある)

Qエクセルの関数で

エクセルの関数辞典を見ていたら、CUMPRINC関数というのがありました。
しかし、エクセルの「挿入」→「関数」→関数の分類で「財務」というのを選択したのですが、一覧表に載っていません。
どこに載っているのでしょうか?
どうすればこの関数を使えますか?
ちなみにシートの上でやっても関数の反応をしませんでした。

Aベストアンサー

Yahooで検索してみると、参考URLが引っかかりました。

参考になりませんか?

参考URL:http://money-sense.net/doc/20041215_224257.php

Qvoid main(void){...}だとDosWindowが開くので

わざわざWindowsアプリにして以下のようにするしかないのでしょうか?

LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP)
{
//ここに宣言を置く
switch(wM)
{
case WM_CREATE:
//ここに処理を置く
return 0;
default:
return(DefWindowProc(hW,wM,wP,lP));
}
}
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW,hPW;
MSGms;

wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=NULL;
wc.cbWndExtra=NULL;
wc.hIcon=LoadIcon(NULL,IDI_EXCLAMATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName=NULL;
RegisterClass(&wc);
hW=CreateWindow
(
"goo",
"教えて!goo",
WS_OVERLAPPED,
0,
0,
640,
456,
NULL,
NULL,
hI,
NULL
);
ShowWindow(hW,nCS);
UpdateWindow(hW);
while(GetMessage(&ms,NULL,NULL,NULL))
{
TranslateMessage(&ms);
DispatchMessage(&ms);
}
return (ms.wParam);
}

もっと簡単にDosWindowが開かないようにする方法はないのでしょうか?
もしないとすると上記記述でもっと簡単にできないでしょうか?

わざわざWindowsアプリにして以下のようにするしかないのでしょうか?

LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP)
{
//ここに宣言を置く
switch(wM)
{
case WM_CREATE:
//ここに処理を置く
return 0;
default:
return(DefWindowProc(hW,wM,wP,lP));
}
}
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW,hPW;
MSGms;

wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc...続きを読む

Aベストアンサー

ウィンドウを開く必要がないなら、mainをWinMainに変更するだけで良いのでは? ウィンドウクラス登録、ウィンドウ作成、メッセージループ、ウィンドウプロシージャは全て不要な気がしますが。

WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
  //処理内容

  return 0;
}

Qエクセルの関数 ネスト

エクセルの関数 ネスト

エクセルの関数で、ネストさせるときがあるとおもうのですが、

関数を内側に書いたらよいのか外側に書いたらよいのか分からなくなる時があります。

エクセルの関数に関してわかりやすく書いてあるページなどありますか。

Aベストアンサー

こんばんは

Excel2003までは、ネストが7まで、2007では64までが可能です。
http://www.google.co.jp/search?hl=ja&source=hp&q=excel+%E3%83%8D%E3%82%B9%E3%83%88%E3%80%802003%E3%80%802007&aq=f&aqi=&aql=&oq=&gs_rfai=

「仕様上は可能」でも、複雑なネストは間違いが生じやすいですし、変更もしにくくなります。「出来るだけネストはしない」「適宜、中間結果をセルに出力する」という方法を採った方が、間違いが少なく、柔軟性のあるシステムになると思います。

>エクセルの関数に関してわかりやすく書いてあるページなどありますか。
関数の個別の機能ならば、Webサイトも書籍も多数あるのですが、「組み合わせて使う」というのはその場その場での発想になってしまうと思います。

QVC++6.0 MFC APPWizard(exe)で_main未解決

VC++6.0のMFC APPWizard(exe)において、リンカーオプションの
subsystem:console でDOS画面にprintfでデバッグ出力しようとしたのですが、Buildで、
msvcrtd.lib(crtexe.obj) : error LNK2001: 外部シンボル "_main" は未解決です
と怒られてしまいます。
この対策または、目的を達成するためにはどうすればよいのでしょうか?どなたか教えてください。

また、Visual Studio 2005 でもVC++で同じようなことになるのでしょうか?

Aベストアンサー

★アイディア
・デバッグするために printf() 関数を利用したいのでしょうか?
 ウインドウに出力するよりもファイルに出力した方が簡単な気がします。
・それともコンソール画面にどうしても出力したいのでしょうか?
 コンソール画面の操作は詳しくありませんが、簡単なモードレス・ダイアログを
 1つ用意してそのダイアログにはエディット・ボックスを1つ貼り付けておきます。
・そしたら printf() の代わりに wsprintf() 関数で作成した文字列をエディット
 ボックスにどんどん文字列追加していく方法はどうでしょうか。
 文字列の追加は
 http://oshiete1.goo.ne.jp/qa2854941.html→『エディットボックスで改行』
 を参考にして下さい。
 EM_REPLACESEL メッセージでエディット・ボックスに文字列を追加できます。
・以上。簡易デバッグ画面の出力アイディアでした。

参考URL:http://www.nitoyon.com/vc/tutorial/debug/win32.htm

★アイディア
・デバッグするために printf() 関数を利用したいのでしょうか?
 ウインドウに出力するよりもファイルに出力した方が簡単な気がします。
・それともコンソール画面にどうしても出力したいのでしょうか?
 コンソール画面の操作は詳しくありませんが、簡単なモードレス・ダイアログを
 1つ用意してそのダイアログにはエディット・ボックスを1つ貼り付けておきます。
・そしたら printf() の代わりに wsprintf() 関数で作成した文字列をエディット
 ボックスにどんどん文字列追加していく...続きを読む

Qエクセル関数の解読サイトなんてありますか?

エクセル関数の解読サイトなんてありますか?

いつもお世話になっております<(_ _)>

エクセルファイルに関数の入った数式が入力されています。
セルごとに複数の関数が入っていますが、私にはちっともわかりません。

そこで質問です。
こんなとき「エクセル関数を解読」してくれるようなサイトってありませんか?

たとえば検索窓があってそこに「=SUM(S1:S13)」わからなくて困っている関数式を入力。
すると答えの別ボックスに「S1~S13までの数値の合計」と出てくるようなサイト。

それに近いサイトでも良いので知っている方がいらっしゃればぜひ、教えてください<(_ _)>

Aベストアンサー

もし、

=IF(E14="","",IF(O14="",(IF(E14>"18:00"*1,"18:00",E14)-IF(C14<="8:00"*1,"8:00",C14))*24*1300,(IF(E14>"18:00"*1,"18:00",E14)-IF(C14<="8:00"*1,"8:00",C14))*24*1625))

だったら、どういう文章が出て欲しいのでしょうか?

もしE14が空白だったら、
 空白、
そうじゃなかったから、
 もしO14が空白だったら、
  (もしE14が18:00より大きかったら18:00、そうじゃなかったらE14)-(もしC14が8:00以下だったら8:00、そうじゃなかったらC14)×24×1300
 そうじゃなかったら、
  (もしE14が18:00より大きかったら18:00、そうじゃなかったらE14)-(もしC14が8:00以下だったら8:00、そうじゃなかったらC14)×24×1625

って感じですか?
数式をそのまま読解したほうが解りやすくないですか?

QC言語 int main(void) main()

C言語のmain関数について、質問させていただきます。

私の手元に、林 晴比古さんが執筆された著書、
2007年度版の新C言語入門 スーパービギナー編 (C言語実用マスターシリーズ) [単行本]
http://www.amazon.co.jp/gp/product/4797325631/ref=oh_details_o04_s00_i00?ie=UTF8&psc=1
があります。

これと同一の2000年度版の著書、
http://www.amazon.co.jp/%E6%96%B0C%E8%A8%80%E8%AA%9E%E5%85%A5%E9%96%80-%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E7%B7%A8-C%E8%A8%80%E8%AA%9E%E5%AE%9F%E7%94%A8%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%9E%97-%E6%99%B4%E6%AF%94%E5%8F%A4/dp/4797306718/ref=sr_1_cc_1?s=aps&ie=UTF8&qid=1383091260&sr=1-1-catcorr&keywords=%E6%96%B0C%E8%A8%80%E8%AA%9E%E5%85%A5%E9%96%80+%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E7%B7%A8
も、所持しています。

main関数の書き方が、2007年度版の新しい方では、
int main(void)
{
}
と記載されており、
2000年度版の古い方では
main()
{
}
と記載されています。

改訂版なので両者を同じページで内容や例題を照らし合わせても、この部分が変わっていることを確認できます。
つまり、2007年度版では、2000年度版では書かかなくてよかった「void」を、一新して記載するようになっています。

ここで質問ですが、両方のやり方で、コンパイルすると両方ともエラーなくきちんと表示されます。しかしこれはどのような理由で変更されたのでしょうか?

詳しい方がいましたら、ご回答よろしくお願い申し上げます。

C言語のmain関数について、質問させていただきます。

私の手元に、林 晴比古さんが執筆された著書、
2007年度版の新C言語入門 スーパービギナー編 (C言語実用マスターシリーズ) [単行本]
http://www.amazon.co.jp/gp/product/4797325631/ref=oh_details_o04_s00_i00?ie=UTF8&psc=1
があります。

これと同一の2000年度版の著書、
http://www.amazon.co.jp/%E6%96%B0C%E8%A8%80%E8%AA%9E%E5%85%A5%E9%96%80-%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E7%B7%A8-C%E8%A8%80%E8%AA%...続きを読む

Aベストアンサー

本当に「詳しい人」に聞きたいなら, こんなところに質問するのではなく出版社に問い合わせるべきではないかな. 著者自身がここを見てるかどうかわからないし, よしんば見て回答していたとしてもそれが本当に「著者の回答」なのか, 判断のしようもないでしょ?

まず 1つ考えられるのが「お行儀」. 引数リストの void は「今の場合は」書かなくてもいい (書いてあるかどうかで意味の変わる場面は存在する) し, 返り値の型も「省略されていれば int」と推定するので書かなくてもいい. でも, いろいろ考えた結果「引数がないときには void と書く」とか「返り値の型は int であっても書く」とかしたんじゃないかな.... 手元にその本は (どっちの版も) ないので確認できないんだけど, 前の版で main の中に return 文はありますか?

もう 1つ, 返り値の型を書くようになった理由としては C++ の絡みも考えられます.

まあ今から勉強するならどちらも書かない理由はないわけですが.

Qエクセル関数を、書き写して分析できるツールはある?

タイトルの件、質問します。

エクセルの関数を分析する際に、エクセルの数式バーや、セルに入っている関数を
F2を教えて見るのでは、見にくい場合があります。

現在は、私は、メモ帳に関数をコピーして、分析したり、修正したりしています。
エクセルの機能or他ソフトで、関数を分析できるツールはあるのでしょうか??

【エクセルバージョン】
2003、2007

Aベストアンサー

難解な数式を理解したいとき,最も便利に利用できるのは,2003ではツールメニューのワークシート分析にある「数式の検証」です。
2007では数式タブにあります。

メンドクサイ数式のセルで数式の検証を使い,どの関数やどのカッコから計算が進んでいくのかを1ステップずつトレースして理解します。また意図しない結果がどの段階で発生しているのか追跡します。

このやり方は勿論間違った数式(意図しない結果が出てきた場合)を追跡するのにも使いますが,むしろ誰かに教わった「正しい数式」を理解する時に便利な方法です。
そもそも計算が通っていない(たとえばカッコの対応が間違えていて,Enterしても受け付けてくれないようなミスをしている場合)には使えません。



また,数式バーの中で数式の「中」にカーソルを入れて左右の矢印キーでカーソルを動かしていったときに,「(」や「)」をまたいだ瞬間に,対応する「閉じカッコ」「始まりのカッコ」が色つきで強調表示されるのを確認しながら,カッコの対応がまちがえてないかなどを調べるのも簡易な良い方法です。


あまり使わない方法ですが,数式の中で適宜ALT+Enterを打って「セル内改行」してしまい,数式を縦に分解して書いてみるのも整理しやすい方法のひとつです。

難解な数式を理解したいとき,最も便利に利用できるのは,2003ではツールメニューのワークシート分析にある「数式の検証」です。
2007では数式タブにあります。

メンドクサイ数式のセルで数式の検証を使い,どの関数やどのカッコから計算が進んでいくのかを1ステップずつトレースして理解します。また意図しない結果がどの段階で発生しているのか追跡します。

このやり方は勿論間違った数式(意図しない結果が出てきた場合)を追跡するのにも使いますが,むしろ誰かに教わった「正しい数式」を理解する時に便利...続きを読む

Qcygwin1.dll を必要としないCのexeファイルを作りたいです

はじめまして、shigure2005と申します。

私は普段UNIX上でC言語のプログラムを書いているのですが、
わけあってWindows上で動くようにする必要が出てきました。
そのプログラムをそのままcygwinでコンパイルしたところ
コンパイルでき、実行ファイルも問題なく実行できたのですが、
このままですとcygwin1.dllが必要になってしまいます。
ですので、これがなくてもすむような別のコンパイル方法を
教えていただければと思ったしだいです。

過去ログを探って、MinGWについては試してみたのですが、
コンパイルは問題なく通るのに、なぜか実行ファイルを
実行すると、うまく起動できません。Mingwは以下のファイルを
ダウンロードしてインストールしました。
mingw-runtime-3.8.tar.gz
mingw-utils-0.3.tar.gz
MinGW-4.1.1.exe
w32api-3.3.tar.gz
binutils-2.15.91-20040904-1.tar.gz
mingw32-make-3.80.0-3.exe
PATHは「C:\mingw/bin;C:\cygwin/bin」の順に通していて、
コマンドプロンプトでコンパイルし、コンパイル後、
コンパイルに用いたdllがcygwin1.dllでないのを確認して
います。また、helloworldなど簡単なプログラムなら、
Mingwでもうまくコンパイルできてます。cygwinとMingwで
コンパイル性能に大きな差などがあるのでしょうか?

また、cygwinだけでも、Mingw-runtimeをインストール
すれば、cygwin1.dllを必要としない形式にコンパイル
できるという話を聞いたのですが、ご存知の方が
いらしたら教えてください。

どうぞよろしくお願いします。

はじめまして、shigure2005と申します。

私は普段UNIX上でC言語のプログラムを書いているのですが、
わけあってWindows上で動くようにする必要が出てきました。
そのプログラムをそのままcygwinでコンパイルしたところ
コンパイルでき、実行ファイルも問題なく実行できたのですが、
このままですとcygwin1.dllが必要になってしまいます。
ですので、これがなくてもすむような別のコンパイル方法を
教えていただければと思ったしだいです。

過去ログを探って、MinGWについては試してみたのですが、
コ...続きを読む

Aベストアンサー

> なぜかプログラム中に一箇所printfを入れないとまったく動かず、
> 入れると動くという状況になってしまいました。

私も昔はときどきそういったことに遭遇しました。
結局、不定や未定義の動作に依存した実装をしているからそういうことが起こるんですね。
現物合わせで動けばOKではなく、きちんと言語仕様を把握した上で実装すれば、そうした問題はなくなりますし、逆にそうしないと信頼性の高いコードはかけません。

前にも書いたように、実際にソースを見てみないことには、正確なことは何もわからないので、推測ばかりの発言になってしまうかと思います。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング