• ベストアンサー

C言語について

いつもお世話になっています。 以下のソースを分割コンパルをしたいのですが・・・コンパイルがとおりません。 環境としては、Visual Studio 2005 です。 ヘッダファイルは、 /* People.h */ #include <stdio.h> #include <string.h> typedef struct { char name[256]; int age; int sex; } People; /* 個人データを入力する */ extern void InputPeople(People *data); /* 個人データを表示する */ extern void ShowPeople(People data); で、 /* People.c */ #include "People.h" void InputPeople(People *data) { /* 中身は同じなので省略 */ printf("名前:"); scanf("%s",data->name); printf("年齢:"); scanf("%d",&data->age); printf("性別(1-男性、2-女性):"); scanf("%d",&data->sex); printf("\n"); } void ShowPeople(People data) { /* 中身は同じなので省略 */ char sex[16]; printf("名前:%s\n",data.name); printf("年齢:%d\n",data.age); if (data.sex == 1) { strcpy(sex,"男性"); } else { strcpy(sex,"女性"); } printf("性別:%s\n",sex); printf("\n"); } どこがおかしいのでしょうか?? あと、コマンドのところでは、 C:\ > ←のあとは、普通にcl People.cとすればいいのでしょうか?

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

  • ベストアンサー
回答No.4

No.1です 普通にmainが無いからエラーしてますね。 普通にclを実行すると、main関数を探しますから、勿論エラーです。 ※ライブラリを作りたいという話では、、、なかったのですね^^; ええっと、、、mainの入れ方ということですが、、、、 このプログラムって何をしたいんでしょう? 何かの課題とか、そんなやつかな?? すんごい初歩的な事書いて外してるかもしれませんが、 main関数とはCのプログラムで一番最初に実行される関数です。 これがなければプログラムは動きません。 質問者さんは二つの関数(peopleの入力と出力)を作ってますが、これはただ、peopleという構造体に値を入れたり、そこから出したりするだけの関数ですね。 だから、例えばこのプログラムを実行しても、そういう二つの動作を身にまとってはいるものの、実際に何をしていいか、システムは分かりません。 案ずるより産むが易し。people.cにこんなのを入れてください int main(void) { People man; InputPeople(&man); ShowPeople(man); return 0; } これでコンパイルしましょう。もしかしたらwarning(注意文)は出るかもしれませんが、まぁそれは無視して。。。 main関数から、色々な動きを呼び出して、プログラムは完結するわけです。 動かしてみたら、意味分かってもらえるかな????

hatenan114
質問者

お礼

わかりました!! ありがとうございます。 課題ではなく、あるサイトであったものを工夫したんです。 またよろしくお願いします。

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★回答ではないが1つ。 >People.cの中にInputPeopleとShowPeopleはあるので…externはおかしいですね。  ↑  『extern』は付いていても問題はないです。  ヘッダの記述なら付いていてもおかしくないです。 ●質問者さんへ。 ・コンパイルできないようですがどんなエラーメッセージが出ますか?  ちなみにソースは main() 関数が無いのを除けば問題はないと思います。  多分は main() 関数を記述していないからコンパイルが出来ていないと思います。  main() 関数は何処に記述しているのですか?  それともライブラリ関数としてコンパイルするつもりですか?  いろいろと補足して下さい。 ・以上。

hatenan114
質問者

お礼

回答有難うございます。 エラーの件ですが、以下のようなものがでています。 LIBCMT.lib(crt0.obj) : error LNK2019: 未解決の外部シンボル _main が関数 ___tmain CRTStartup で参照されました。 People.exe : fatal error LNK1120: 外部参照 1 が未解決です 今、気づいたのですが、mainがないのが原因みたいです。 そこで、質問なのですが、この場合mainはPeople.cにいれることはわかるのですが、どのようにすればいいのか、アドバイスもらえないでしょうか?

  • morigann
  • ベストアンサー率17% (57/329)
回答No.2

People.cの中にInputPeopleとShowPeopleはあるので…externはおかしいですね。 /* 個人データを入力する */ extern void InputPeople(People *data); /* 個人データを表示する */ extern void ShowPeople(People data);  ↓ /* 個人データを入力する */ void InputPeople(People *data); /* 個人データを表示する */ void ShowPeople(People data); で、良いですね。 InputPeopleとShowPeopleの関数をコールする側のヘッダーにextern…です。 しかし、それでコンパイルが通らなくなるのだろうか…? すいません、分りません! お役に立てず申し訳ありません。

hatenan114
質問者

お礼

回答有難うございます。 ためしてみましたがエラーがでました。 またよろしくお願いします。

回答No.1

コンパイルが通らないとは、どういう意味でしょう?? (何かエラーが出ていると思いますが、なんてかいてありますか?) >C:\ > ←のあとは、普通にcl People.cとすればいいのでしょうか? 確かVCとかはclでコンパイラが動くはずですが、visual studioでやってるんでしたら、そっちからコンパイルかけないのですか? あえてコマンドからコンパイルするのは何故でしょう?? ※main関数が無いのは、分割コンパイルってところから、これをライブラリにしたいのかな?

hatenan114
質問者

お礼

回答有難うございます。 エラーの件ですが、以下のようなものがでています。 LIBCMT.lib(crt0.obj) : error LNK2019: 未解決の外部シンボル _main が関数 ___tmain CRTStartup で参照されました。 People.exe : fatal error LNK1120: 外部参照 1 が未解決です。

関連するQ&A