こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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とすればいいのでしょうか?

投稿日時 - 2007-09-13 22:59:36

QNo.3342807

困ってます

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

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関数から、色々な動きを呼び出して、プログラムは完結するわけです。

動かしてみたら、意味分かってもらえるかな????

投稿日時 - 2007-09-13 23:57:46

お礼

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

投稿日時 - 2007-09-14 00:12:24

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

★回答ではないが1つ。
>People.cの中にInputPeopleとShowPeopleはあるので…externはおかしいですね。
 ↑
 『extern』は付いていても問題はないです。
 ヘッダの記述なら付いていてもおかしくないです。

●質問者さんへ。
・コンパイルできないようですがどんなエラーメッセージが出ますか?
 ちなみにソースは main() 関数が無いのを除けば問題はないと思います。
 多分は main() 関数を記述していないからコンパイルが出来ていないと思います。
 main() 関数は何処に記述しているのですか?
 それともライブラリ関数としてコンパイルするつもりですか?
 いろいろと補足して下さい。
・以上。

投稿日時 - 2007-09-13 23:32:37

お礼

回答有難うございます。
エラーの件ですが、以下のようなものがでています。

LIBCMT.lib(crt0.obj) : error LNK2019: 未解決の外部シンボル _main が関数 ___tmain
CRTStartup で参照されました。
People.exe : fatal error LNK1120: 外部参照 1 が未解決です

今、気づいたのですが、mainがないのが原因みたいです。
そこで、質問なのですが、この場合mainはPeople.cにいれることはわかるのですが、どのようにすればいいのか、アドバイスもらえないでしょうか?

投稿日時 - 2007-09-13 23:39:56

ANo.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…です。
しかし、それでコンパイルが通らなくなるのだろうか…?
すいません、分りません!
お役に立てず申し訳ありません。

投稿日時 - 2007-09-13 23:16:29

お礼

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

投稿日時 - 2007-09-13 23:34:59

ANo.1

コンパイルが通らないとは、どういう意味でしょう??
(何かエラーが出ていると思いますが、なんてかいてありますか?)

>C:\ > ←のあとは、普通にcl People.cとすればいいのでしょうか?
確かVCとかはclでコンパイラが動くはずですが、visual studioでやってるんでしたら、そっちからコンパイルかけないのですか?
あえてコマンドからコンパイルするのは何故でしょう??

※main関数が無いのは、分割コンパイルってところから、これをライブラリにしたいのかな?

投稿日時 - 2007-09-13 23:15:36

お礼

回答有難うございます。
エラーの件ですが、以下のようなものがでています。

LIBCMT.lib(crt0.obj) : error LNK2019: 未解決の外部シンボル _main が関数 ___tmain
CRTStartup で参照されました。
People.exe : fatal error LNK1120: 外部参照 1 が未解決です。

投稿日時 - 2007-09-13 23:31:43