C言語関係掲示板

過去ログ

No624 未解決エラーと函数

[戻る] [ホームページ]
No.6301

配属アルゴリズム
投稿者---will(2003/05/13 16:58:02)


#include    <stdio.h>
#include    <string.h>
#define      WORD_LEN 82
#define      CLASSNUM 4
#define      HUMANNUM 20
#define      MODNUM   4
typedef struct    CLASStype
{
    char        name[WORD_LEN];
    int         maxnum;
}CLASStype;
typedef struct    HUMANtype
{
    char        name[WORD_LEN];
    char        serial[WORD_LEN];
    int         hope[CLASSNUM];
    int         result;
}HUMANtype;
int readCdata(char ClassFname[WORD_LEN], CLASStype CData[CLASSNUM]);
intreadHdata(char HumanFname[WORD_LEN], HUMANtype HData[HUMANNUM]);
int menu_mod(CLASStype CData[CLASSNUM], HUMANtype HData[HUMANNUM]);
int menu_out(CLASStype CData[CLASSNUM], HUMANtype HData[HUMANNUM]);
void initialCData(CLASStype CData[CLASSNUM]);
void initialHData(HUMANtype HData[CLASSNUM]);
int main(int argc, char *argv[])
{
    FILE        *FP;
    char        ClassFname[WORD_LEN];
    char        HumanFname[WORD_LEN];
    CLASStype   CData[CLASSNUM];
    HUMANtype   HData[HUMANNUM];
    if (argc != 3)
    {
        printf("\n\n実行引数にファイル名の指定が必要です\n");
        printf("[実行ファイル名] [研究室datafile名] [学生datafile名]\n");
        printf("として実行してください\n");
        return(1);
    }
    if ( (FP = fopen(argv[1], "r")) == NULL)
    {
        printf("\n\nファイル[%s]が開けません\n", argv[1]);
        return(2);
    }
    fclose(FP);
    strcpy(ClassFname, argv[1]);
    if ( (FP = fopen(argv[2], "r")) == NULL)
    {
        printf("\n\nファイル[%s]が開けません\n", argv[2]);
        return(2);
    }
    fclose(FP);
    strcpy(HumanFname, argv[2]);
    if (readCdata(ClassFname, CData) != 0)
    {
        printf("研究室Data[%s]読み込みエラー\n", ClassFname);
        printf("終了します\n");
        return(3);
    }
    if (readHdata(HumanFname, HData) != 0)
    {
        printf("学生Data[%s]読み込みエラー\n", HumanFname);
        printf("終了します\n");

        return(3);
    }
    if (menu_mod(CData, HData) != 0)
    {
        printf("\n\nエラーのため終了します\n");
        return(3);
    }
    printf("処理を完了しました");
    if (menu_out(CData, HData) != 0)
    {
        printf("\n\nエラーのため終了します\n");
        return(3);
    }
    printf("完了しました");
    return(0);
int readCdata(char ClassFname[WORD_LEN], CLASStype CData[CLASSNUM])
{
    FILE        *CFP;
    int         Cloop;
    char        readline[WORD_LEN];
    int         readnum;
    initialCData(CData);
    if ( (CFP = fopen(ClassFname,"r")) == NULL)
    {
        printf("ファイル[%s]を処理中に重大なエラー\n", ClassFname);
        printf("強制終了します\n");
        return(1);
    }
     fgets(readline, 80, CFP);
    for (Cloop = 0; Cloop < CLASSNUM; Cloop++)
    {
        if (fgets(readline, 80, CFP) == NULL)
        {
            printf("ファイル[%s]の記述エラー\n", ClassFname);
            fclose(CFP);
            return(2);
        }
        strncpy(CData[Cloop].name, readline, strlen(readline)-1);
        if (fgets(readline, 80, CFP) == NULL)
        {
            printf("ファイル[%s]の記述エラー\n", ClassFname);
            fclose(CFP);
            return(2);
        }
        sscanf(readline, "%d", &readnum);
        if ( (readnum < 0) || (readnum > HUMANNUM) )
        {
            printf("ファイル[%s]の記述エラー\n", ClassFname);
            fclose(CFP);
            return(3);
        }
        CData[Cloop].maxnum = readnum;
    }
    fclose(CFP);
    return(0);
}
int readHdata(char HumanFname[WORD_LEN], HUMANtype HData[HUMANNUM])
{
    FILE        *HFP;
    int         Hloop;
    char        readline[WORD_LEN];
    int         loop, readnum;
    initialHData(HData);
    if ( (HFP = fopen(HumanFname,"r")) == NULL)
    {
        printf("ファイル[%s]を処理中に重大なエラー\n", HumanFname);
        printf("強制終了します\n");
        return(1);
    }
    fgets(readline, 80, HFP);
    for (Hloop = 0; Hloop < HUMANNUM; Hloop++)
    {
        fgets(readline, 80, HFP);
        if (fgets(readline, 80, HFP) == NULL)
        {
            printf("ファイル[%s]の記述エラー\n", HumanFname);
            fclose(HFP);
            return(2);
        }
        strncpy(HData[Hloop].name, readline, strlen(readline)-1);

        if (fgets(readline, 80, HFP) == NULL)
        {
            printf("ファイル[%s]の記述エラー\n", HumanFname);
            fclose(HFP);
            return(2);
        }
        strncpy(HData[Hloop].serial, readline, strlen(readline)-1);
         for (loop = 0; loop < CLASSNUM; loop++)
        {
            if (fgets(readline, 80, HFP) == NULL)
            {
                printf("ファイル[%s]の記述エラー\n", HumanFname);
                fclose(HFP);
                return(2);
            }
            sscanf(readline, "%d", &readnum);
            if ( (readnum < 0) || (readnum > CLASSNUM) )
            {
                printf("ファイル[%s]の記述エラー\n", HumanFname);
                fclose(HFP);
                return(3);
            }
            HData[Hloop].hope[loop] = readnum-1;
        }
    }
    return(0);
}

をコンパイルすると、外部のシンボル'_menu_mod'、'_menu_out'、'_initialCData'、'_initialHData'が未解決とエラー画面が出るのですがどう直せばいいのかが分かりません。どうか教えてください

No.6305

Re:配属アルゴリズム
投稿者---こん!(2003/05/13 18:03:20)


>をコンパイルすると、外部のシンボル'_menu_mod'、'_menu_out'、'_initialCData'、'_initialHData'が未解決とエラー画面が出るのですがどう直せばいいのかが分かりません。

そのメッセージのままです。
プロトタイプ宣言されているその函数の実体が無いだけですので、その函数のソ
ースをコンパイルしたオブジェクトファイル、または実体が入っているライブラ
リファイルをリンクするか、或いは函数の実体を今回のソース内にコーディング
してコンパイルしなおして下さい。

No.6309

Re:配属アルゴリズム
投稿者---will(2003/05/13 20:25:31)


>そのメッセージのままです。
>プロトタイプ宣言されているその函数の実体が無いだけですので、その函数のソ
>ースをコンパイルしたオブジェクトファイル、または実体が入っているライブラ
>リファイルをリンクするか、或いは函数の実体を今回のソース内にコーディング
>してコンパイルしなおして下さい。


いまいち理解できないんですが・・・
具体的にはどのようにすればいいのですか?

No.6311

Re:配属アルゴリズム
投稿者---しんちー(2003/05/13 21:07:31)


int のあとのスペースを忘れている部分がありませんか?

No.6312

Re:配属アルゴリズム
投稿者---will(2003/05/13 21:26:03)


>int のあとのスペースを忘れている部分がありませんか?


intreadHdata(char HumanFname[WORD_LEN], HUMANtype HData[HUMANNUM]);
ですよね?すいませんこれは写し間違いです・・・なので、int readHdata(char HumanFname[WORD_LEN], HUMANtype HData[HUMANNUM]);でやってもさっき書いたエラーはでます。


No.6314

Re:配属アルゴリズム
投稿者---しんちー(2003/05/13 21:29:24)


このコードでは menu_mod などの関数は定義されていませんよね?
それらはどこにありますか?

No.6315

Re:配属アルゴリズム
投稿者---こん!(2003/05/13 21:30:02)


>いまいち理解できないんですが・・・
>具体的にはどのようにすればいいのですか?

具体的に書いたつもりなのですが・・・
しんちーさんの指摘も確かですがソースの上の方で宣言されている
menu_mod
menu_out
initialCData
initialHData
という函数はどこにあるのでしょうか?
それを作って下さいと言ったのです。

No.6318

Re:配属アルゴリズム
投稿者---ともじ(2003/05/13 21:47:15)


>いまいち理解できないんですが・・・
>具体的にはどのようにすればいいのですか?

下の例1のようにするとリンク時に外部シンボルの未解決エラーが出ます。
これは、mainでfunc1とfunc2を呼んでいるのに、func1とfunc2の定義が
ないからですね。
例2のように、同じファイル中にfunc1とfunc2を記述してやるときちんと
リンクをすることができます。これが、こん!さんが言っている
「函数の実体を今回のソース内にコーディングしてコンパイルしなおして
下さい。」の意味です。

また、func1とfunc2をmainと同じファイルに記述しない場合には、
func1とfunc2を記述したファイルをコンパイルしてできたオブジェクト
ファイルを、mainのあるファイルをコンパイルしてできたオブジェクト
ファイルと一緒にリンクすることによって連係編集することも可能です。
これが、こん!さんが言っている、「その函数のソースをコンパイルした
オブジェクトファイル、または実体が入っているライブラリファイルを
リンクする」という意味です。

-ファイル1------------------------------------------------------
/* 例1 これはリンクエラーで実行ができない */
#include <stdio.h>

void func1(void);
void func2(void);

int main(void)
{
    func1();
    func2();
    
    return 0;
}
----------------------------------------------------------------

-ファイル2------------------------------------------------------
/* 例2 これはリンクができて実行が可能 */
#include <stdio.h>

void func1(void);
void func2(void);

int main(void)
{
    func1();
    func2();
    
    return 0;
}

void func1(void)
{
    printf("func1\n");
}

void func2(void)
{
    printf("func2\n");
}
----------------------------------------------------------------


ところで、こん!さんは「函数」といつも書きますが、これは何故ですか。


No.6320

Re:配属アルゴリズム
投稿者---こん!(2003/05/13 22:06:26)


>ところで、こん!さんは「函数」といつも書きますが、これは何故ですか。

何故といわれても・・・
じじぃですよって、昔から周りではみんなそう書いていたから。
慣習って奴ですか。
何か問題あります?

No.6321

Re:配属アルゴリズム
投稿者---こん!(2003/05/13 22:10:32)


>>ところで、こん!さんは「函数」といつも書きますが、これは何故ですか。
>
>何故といわれても・・・

ふと我にかえりあわてて手元の新ANSI C言語辞典をひもといてみると
293ページに

函数 =関数

と書いてあった。
よかった・・・

No.6433

Re:配属アルゴリズム
投稿者---うらかた(2003/05/16 10:04:30)


>
>函数 =関数

その昔(1970年代以前?)、数学の本ではfunctionを
函数(かんすう)と書いていました。

その後,当用漢字が何度か改定されていく中で
「函」が当用漢字から除外されてしまいました。

函数の代わりに関数と書くようになったのは、そのためではないでしょうか。

函を「はこ」とも読むためかもしれませんが、キャリアの長い数学教師の中には函数と書いて「はこすう」と読んでいる人も居ました。

個人的には、「はこすう」と読んだほうが初学者にはイメージし易い気がします。

理工系の古本屋に行くと、数学の古典的教科書「解析概論」(高木貞治著)
の旧版がたまに売られています。
昔の理系学生は、勉強している人も勉強していない人(笑)も,とりあえずこれを持って歩いていました。
これをみると函数って書いてありますね。

会社の若い人に「函数」の表記を聞いてみたところ、
現代版は、修正されて「関数」と書かれているらしいですね。


No.6438

Re:配属アルゴリズム
投稿者---こん!(2003/05/16 10:31:18)


>会社の若い人に「函数」の表記を聞いてみたところ、
>現代版は、修正されて「関数」と書かれているらしいですね。

つまりわしは過去の遺物ってことね。(;_;)ヴヴヴ

またまた脱線。

それはそれとして、
正しいかどうかは置いといて私の頭の中では関数と書くと三角関数・・・なんか
が浮かんできて数学的かな、函数と書くとFunction的かな、という意識で使い分
けておりました。

詳細な調査ありがとうございました。

こん!<=^・^=>