ページ 11

exeファイルの作成方法について

Posted: 2014年11月17日(月) 14:14
by ハッセス
初めまして
このたび某c言語試験を受けようと思ってるプログラミング歴1年の超初心者ですが、
基本的な質問をさせてください。
試験の例題のソースコードをコマンドプロンプトでコンパイルしてexeファイルを作ろうとしても

コード:

Error: Unresolved external '〇〇〇〇' referenced from C:\〇〇〇〇.OBJ
というエラーが出て実行ファイルが作れません(OBJファイルは作られます)
要するに他のソースファイルが見当たらない(見つけられない)ようなのですが、
ソースコードは例題をダウンロードしたものをそのままコピーして使用しているので
記述間違いという可能性はないと思います。
ちなみにOSはWindows7、コンパイラはBorland C++を使用しています。
どなたか解決方法が思い当たる方がいらっしゃいましたら是非助言をお願いします。

Re: exeファイルの作成方法について

Posted: 2014年11月17日(月) 14:45
by LL
この事案と一緒じゃないですかね?
http://dixq.net/forum/viewtopic.php?f=3&t=2006

Win32APIとコンソールアプリケーションをごっちゃにしてたりしてませんか?

Re: exeファイルの作成方法について

Posted: 2014年11月18日(火) 14:07
by ハッセス
お答えありがとうございます。
すみません、上記の事案は多分Visual Studioとかを使用した場合ではないかと思うのですが、
自分はそういうツールは使わずにコマンドプロンプトから
bcc32 〇〇〇〇.cと入力して実行ファイルを作るやり方で、
一応試験のサイトには、全てのソースコードの頭に「#define TOI1」とつけてくださいとあるのですが、
その通りにやってもやはり当初のエラーが出てしまいます。

Re: exeファイルの作成方法について

Posted: 2014年11月18日(火) 17:08
by box
当該のソースコード全体を見せてください。
ハッセス さんが書きました:

コード:

Error: Unresolved external '〇〇〇〇' referenced from C:\〇〇〇〇.OBJ
このエラーは、
○○○○
という関数を呼び出そうとしているけど、実体がどこにもないよ、という意味です。
ハッセス さんが書きました: 要するに他のソースファイルが見当たらない(見つけられない)ようなのですが、
というわけではないような気がします。
単なるスペル間違いとか。

Re: exeファイルの作成方法について

Posted: 2014年11月19日(水) 14:02
by ハッセス
お答えありがとうございます。
すみません、少し長くなりますが
main.c

コード:

#include <stdio.h>
#include <string.h>

#include "common.h"
#include "main.h"
#include "nyuukai.h"
#include "keisoku.h"
#include "sakujyo.h"

/***********************************/
/* 共通データ                      */
/***********************************/

/* 空きコード表 */
int akicode_tbl[ MEMBER_MAX + 1 ];

/* コード・データ対照表 */
int codedata_tbl[ MEMBER_MAX ];

/* 個人別計測データ表 */
struct KEISOKU_TBL kojin_keisoku_tbl;

/*ソート用計測データ表 */
struct KEISOKU_TBL sort_keisoku_tbl[ MEMBER_MAX ];


/***********************************/
/* 会員管理メイン制御              */
/*   メインルーチン                */
/*                                 */
/*   パラメータ : なし             */
/*   リターン   : なし             */
/***********************************/
int main( void )
{
    int    loop = TRUE;                 /* ループフラグ                  */
    char   work[ 128 ];                 /* 入力ワーク                    */
    FILE   *fp;                         /* ファイルポインタ              */
    char   *fname1 = AKICODE_TBL_NAME;  /* 空きコード表ファイル          */
    char   *fname2 = CODEDATA_TBL_NAME; /* コード・データ対照表ファイル  */
    int    i;                           /* インデックス                  */

    /* 空きコード表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname1, "rb" )) == NULL ) {
        printf( "\n 空きコード表ファイルを作成しています" );

        /* 空きコード表ファイル作成 */
        akicode_tbl_create( );
    }
    else {
        /* 空きコード表ファイル CLOSE */
        fclose( fp );
    }

    /* コード・データ対照表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname2, "rb" )) == NULL ) {
        printf( "\n コード・データ対照表ファイルを作成しています" );

        /* コード・データ対照表ファイル作成 */
        codedata_tbl_create( );
    }
    else {
        /* コード・データ対照表ファイル CLOSE */
        fclose( fp );
    }

    while( loop ) {
        /* テーブル初期クリア */
        akicode_tbl[ 0 ] = 0;
        for( i = 0; i < MEMBER_MAX; i++) {
            akicode_tbl[ i + 1 ] = 0;
            codedata_tbl[ i ] = 0;
            sort_keisoku_tbl[ i ] = init_kojin_keisoku_tbl();
        }
        kojin_keisoku_tbl = init_kojin_keisoku_tbl();

        printf( "\n" );
        printf( "\n *******************************************" );
        printf( "\n  アスレチッククラブ メンバー管理プログラム" );
        printf( "\n *******************************************" );
        printf( "\n 処理を選択してください" );
        printf( "\n 1:入会登録" );
        printf( "\n 2:計測記録入力" );
        printf( "\n 3:登録削除" );
        printf( "\n E:終了" );
        printf( "\n ? " );

        /* 処理区分入力 */
        work[ 0 ] = '\0';
        scanf( "%s", work );

        /* 入力桁数チェック -> 1以外 ? */
        if( strlen( work ) != 1 ) {
            printf( "\n 入力ミスです" );
            continue;
        }

        switch( work[ 0 ] ) {
            case '1':       /* 入会登録     */
                nyuukai_touroku( );
                break;

            case '2':       /* 計測記録入力 */
                keisoku_input( );
                break;

            case '3':       /* 登録削除     */
                touroku_sakujyo( );
                break;

            case 'e':       /* 終了         */
            case 'E':
                loop = FALSE;
                break;

            default:
                printf( "\n 入力ミスです" );
                break;
        }
    }
    return OK;
}



/************************************/
/* 会員管理メイン制御               */
/*   空きコード表 作成処理         */
/*                                  */
/*   パラメータ : なし              */
/*   リターン   : 0:OK              */
/*               -1:NG              */
/************************************/
static int akicode_tbl_create( void )
{
    int     ret;                        /* リターンコード        */
    int     i;                          /* インデックス          */
    FILE    *fp;                        /* ファイルポインタ      */
    char    *fname = AKICODE_TBL_NAME;  /* 空きコード表ファイル  */

    /* 空きコード編集 */
    akicode_tbl[ 0 ] = MEMBER_MAX;
    for( i = 1; i < MEMBER_MAX + 1; i++ ) {
        akicode_tbl[ i ] = i;
    }

    /* 空きコード表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname, "w+b" )) == NULL ) {
        printf( "\n 空きコード表ファイル OPEN エラー" );
        return NG;
    }

    /* 空きコード表ファイル WRITE -> 1以外 ? */
    if( (ret = fwrite( (char *)akicode_tbl, sizeof( akicode_tbl ), 1, fp ) )
               != 1 ) {
        printf( "\n 空きコード表ファイル WRITE エラー" );
        ret = NG;
    }
    else {
        ret = OK;
    }

    /* 空きコード表ファイル CLOSE */
    fclose( fp );

    return ret;
}



/************************************/
/* 会員管理メイン制御               */
/*   コード・データ対照表 作成処理 */
/*                                  */
/*   パラメータ : なし              */
/*   リターン   : 0:OK              */
/*               -1:NG              */
/************************************/
static int codedata_tbl_create( void )
{
    int     ret;                            /* リターンコード                */
    FILE    *fp;                            /* ファイルポインタ              */
    char    *fname = CODEDATA_TBL_NAME;     /* コード・データ対照表ファイル  */
    int     i;                              /* インデックス                  */

    /* コード・データ対照表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname, "w+b" )) == NULL ) {
        printf( "\n コード・データ対照表ファイル OPEN エラー" );
        return NG;
    }

    for( i = 0; i < MEMBER_MAX; i++ )
        codedata_tbl[ i ] = 0;

    /* コード・データ対照表ファイル WRITE -> 1以外 ? */
    if( (ret = fwrite( (char *)codedata_tbl, sizeof( codedata_tbl ), 1, fp ) )
               != 1 ) {
        /* WRITE エラー */
        printf( "\n コード・データ対照表ファイル WRITE エラー" );
        ret = NG;
    }
    else {
        ret = OK;
    }

    /* コード・データ対照表ファイル CLOSE */
    fclose( fp );

    return ret;
}



/************************************/
/* 共通ルーチン                     */
/************************************/


/************************************/
/* 共通ルーチン                     */
/*   空きコード表 読込み処理       */
/*                                  */
/*   パラメータ : なし              */
/*   リターン   : 0:OK              */
/*               -1:NG              */
/************************************/
int akicode_tbl_read( void )
{
    int     ret;                         /* リターンコード         */
    int     i;                           /* インデックス           */
    FILE    *fp;                         /* ファイルポインタ       */
    char    *fname = AKICODE_TBL_NAME;   /* 空きコード表ファイル   */

    /* 空きコード表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname, "rb" )) == NULL ) {
        printf( "\n 空きコード表ファイル OPEN エラー" );
        return NG;
    }

    for( i = 0; i < MEMBER_MAX + 1; i++ ) {
        /* 空きコード表ファイル READ -> 1以外 ? */
        if( (ret = fread( (char *)&akicode_tbl[ i ], sizeof( int ), 1, fp ) )
                   != 1 ) {
            /* READエラーあり ? */
            if( ferror( fp ) != 0 ) {
                printf( "\n 空きコード表ファイル READ エラー" );
                ret = NG;
            }
            else {
                /* ファイル EOF でない? */
                if( feof( fp ) == 0 ) {
                    printf( "\n 空きコード表ファイル READ エラー" );
                    ret = NG;
                }
                else {
                    ret = OK;
                }
            }
            break;
        }
    }

    /* 空きコード表ファイル CLOSE */
    fclose( fp );

    return ret;
}



/***********************************/
/* 共通ルーチン                    */
/*   実行確認入力処理              */
/*                                 */
/*   パラメータ :確認メッセージ    */
/*   リターン   : 0:OK             */
/*               -1:NG             */
/***********************************/
int kakunin_input( char *msg )
{
    int     ret;            /* リターンコード  */
    int     loop = TRUE;    /* ループフラグ    */
    char    work[ 128 ];    /* 入力ワーク      */

    while( loop ) {
        /* 確認表示 */
        printf( msg );
        printf( "\n ? " );

        /* Y/N入力 */
        work[ 0 ] = '\0';
        scanf( "%s", work );

        /* 入力桁数チェック -> 1以外 ? */
        if( strlen( work ) != 1 ) {
            printf( "\n 入力ミスです" );
            continue;
        }

        switch( work[ 0 ] ) {
            case 'Y':   /* Yes */
            case 'y':
                ret  = OK;
                loop = FALSE;
                break;

            case 'N':   /* No */
            case 'n':
                ret  = NG;
                loop = FALSE;
                break;

            default:
                printf( "\n 入力ミスです" );
                break;
        }
    }

    return ret;
}



/************************************/
/* 共通ルーチン                     */
/*   個人計測データ表 読込み処理   */
/*                                  */
/*   パラメータ : 会員コード        */
/*   リターン   : 0:OK              */
/*               -1:NG              */
/************************************/
int kojin_data_read( int kaiin_code )
{
    int     ret;                        /* リターンコード                 */
    FILE    *fp;                        /* 計測データ表ファイルポインタ   */
    long    fptr;                       /* 計測データポインタ             */
    char    *fname = KEISOKU_TBL_NAME;  /* 計測データ表ファイル           */

    /* 計測データ表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname, "rb" )) == NULL ) {
        printf( "\n 計測データ表ファイル OPEN エラー" );
        return NG;
    }

    /* 該当データポインタセット */
    fptr = ( codedata_tbl[ kaiin_code - 1 ] - 1 ) *
             sizeof( struct KEISOKU_TBL );

    /* 計測データ表ファイルを対象の位置まで SEEK -> OK ? */
    if( (ret = fseek( fp, fptr, SEEK_SET )) != OK ) {
        printf( "\n 計測データ表ファイル SEEK エラー" );

        /* 計測データ表ファイル CLOSE */
        fclose( fp );
        return NG;
    }

    /* 計測データ表ファイル READ -> 1以外 ? */
    if( (ret = fread( (char *)&kojin_keisoku_tbl, sizeof( kojin_keisoku_tbl ),
               1, fp )) != 1 ) {
        printf( "\n 計測データ表 READ エラー" );
        ret = NG;
    }
    else {
        ret = OK;
    }

    /* 計測データ表ファイル CLOSE */
    fclose( fp );

    return ret;
}



/************************************/
/* 共通ルーチン                     */
/*   個人計測データ 表示処理       */
/*                                  */
/*   パラメータ : 会員コード        */
/*                表示メッセージ    */
/*   リターン   : なし              */
/************************************/
void kojin_data_disp( int kaiin_code, char *msg )
{
    printf( msg );
    printf( "\n 会員コード %3d", kaiin_code );

    if( kojin_keisoku_tbl.count != 0 ) {
        printf( "\n\n 計測回数    初回日付  データ    " );
        printf( " 最高日付  データ     最新日付  データ" );

        printf( "\n    %3d", kojin_keisoku_tbl.count );

        printf( "    %4.4s-%2.2s-%2.2s",
            &kojin_keisoku_tbl.first_date[ 0 ],
            &kojin_keisoku_tbl.first_date[ 4 ],
            &kojin_keisoku_tbl.first_date[ 6 ] );

        printf( "   %4d", kojin_keisoku_tbl.first_data );

        printf( "    %4.4s-%2.2s-%2.2s",
            &kojin_keisoku_tbl.max_date[ 0 ],
            &kojin_keisoku_tbl.max_date[ 4 ],
            &kojin_keisoku_tbl.max_date[ 6 ] );

        printf( "   %4d", kojin_keisoku_tbl.max_data );

        printf( "    %4.4s-%2.2s-%2.2s",
            &kojin_keisoku_tbl.soku_date[ 0 ],
            &kojin_keisoku_tbl.soku_date[ 4 ],
            &kojin_keisoku_tbl.soku_date[ 6 ] );

        printf( "   %4d", kojin_keisoku_tbl.soku_data[ 0 ] );

        printf( "\n\n    1回前   2回前   3回前   4回前   ");
        printf( "5回前   6回前   7回前   8回前   9回前" );

        printf( "\n " );
        printf( "    %4d", kojin_keisoku_tbl.soku_data[ 1 ] );
        printf( "    %4d", kojin_keisoku_tbl.soku_data[ 2 ] );
        printf( "    %4d", kojin_keisoku_tbl.soku_data[ 3 ] );
        printf( "    %4d", kojin_keisoku_tbl.soku_data[ 4 ] );
        printf( "    %4d", kojin_keisoku_tbl.soku_data[ 5 ] );
        printf( "    %4d", kojin_keisoku_tbl.soku_data[ 6 ] );
        printf( "    %4d", kojin_keisoku_tbl.soku_data[ 7 ] );
        printf( "    %4d", kojin_keisoku_tbl.soku_data[ 8 ] );
        printf( "    %4d", kojin_keisoku_tbl.soku_data[ 9 ] );
    }
    else {
        printf( "    計測データがありません" );
    return;
    }
    return;
}



/************************************/
/* 共通ルーチン                     */
/*   計測データ 初期化処理         */
/*                                  */
/*   パラメータ : なし              */
/*   リターン   : 計測データ        */
/************************************/
struct KEISOKU_TBL init_kojin_keisoku_tbl( void )
{
    static struct KEISOKU_TBL tbl = {
        0, 0, "        ", 0, "        ", 0, "        ", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    };
    return tbl;
}
keisoku.c

コード:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

#include "common.h"
#include "main.h"
#include "keisoku.h"

extern int akicode_tbl[ MEMBER_MAX + 1 ];                  /* 空きコード表           */
extern int codedata_tbl[ MEMBER_MAX ];                     /* コード・データ対照表   */
extern struct KEISOKU_TBL kojin_keisoku_tbl;               /* 個人別計測データ表     */
extern struct KEISOKU_TBL sort_keisoku_tbl[ MEMBER_MAX ];  /* ソート用計測データ表   */


/* 入力計測データテーブル */
static struct  KEISOKU_INPUT   keisoku_indata[ 5 ];

/************************************/
/* 計測記録入力処理                 */
/*   メインルーチン                 */
/*                                  */
/*   パラメータ : なし              */
/*   リターン   : 0:OK              */
/*               -1:NG              */
/************************************/
int keisoku_input( void )
{
    int     ret;                /* リターンコード    */
    int     i;                  /* インデックス      */
    int     kaiin_code;         /* 計測会員コード    */
    int     undou_sisuu;        /* 算出運動指数      */
    char    msg[ 64 ];          /* メッセージエリア  */
    char    keisoku_date[ 9 ];  /* 計測日付          */

    /* 空きコード表 READ -> NG ? */
    if( (ret = akicode_tbl_read( )) == NG ) {
        return ret;
    }

    /* 入会者チェック */
    if( akicode_tbl[ 0 ] >= MEMBER_MAX ) {
        printf( "\n 現在,入会者がいません" );
        return NG;
    }

    /* コード・データ対照表ファイル READ -> NG ? */
    if( (ret = codedata_tbl_read( )) == NG ) {
        return ret;
    }

    /* 計測会員コード入力 */
    kaiin_code_input( &kaiin_code );

    /* 計測日付入力 */
    keisoku_date_input( keisoku_date );

    /* 計測値入力処理 */
    for( i = 0; i < 5; i++ ) {
        keisoku_data_input( i );
    }

    /* 入力データ表示 */
    keisoku_data_disp( kaiin_code, keisoku_date );

    /* 入力確認 */
    strcpy( msg, "\n 入力はよろしいですか( Y/N )" );

    /* 'N' OR 'n'入力 -> OK でない ? */
    if( (ret = kakunin_input( msg )) != OK ) {
        return NG;
    }

    /* 計測データ表 READ -> NG ? */
    if( (ret = kojin_data_read( kaiin_code )) == NG ) {
        return ret;
    }

    /* 計測値計算処理 */
    undou_sisuu_keisan( &undou_sisuu );

    /* 計測データ表 SET */
    kojin_data_update( kaiin_code, keisoku_date, undou_sisuu );

    /* 計測結果データ表示 */
    kojin_data_disp( kaiin_code, "\n ** 計測結果データ **" );

    /* キー入力待ち */
    while( getchar( ) != '\n' ) ;
    printf( "\n リターンキーを押してください" );
    getchar( );

    /* 計測結果順位ソート表示 */
    ret = keisoku_rank( );

    return ret;
}



/**************************************/
/* 計測記録入力処理                   */
/*   コード・データ対照表 読込み処理 */
/*                                    */
/*   パラメータ : なし                */
/*   リターン   : 0:OK                */
/*               -1:NG                */
/**************************************/
static int codedata_tbl_read( void )
{
    int     ret;                        /* リターンコード               */
    FILE    *fp;                        /* ファイルポインタ             */
    char    *fname = CODEDATA_TBL_NAME; /* コード・データ対照表ファイル */

    /* コード・データ対照表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname, "rb" )) == NULL ) {
        printf( "\n コード・データ対照表ファイル OPEN エラー" );
        return NG;
    }

    /* コード・データ対照表ファイル READ -> 1以外 ? */
    if( (ret = fread( (char *)codedata_tbl, sizeof( codedata_tbl ), 1, fp ))
               != 1 ) {
        printf( "\n コード・データ対照表ファイル READ エラー" );
        ret = NG;
    }
    else {
        ret = OK;
    }

    /* コード・データ対照表ファイル CLOSE */
    fclose( fp );

    return ret;
}



/************************************/
/* 計測記録入力処理                 */
/*   会員コード入力処理             */
/*                                  */
/*   パラメータ : 入力会員コード    */
/*   リターン   : なし              */
/************************************/
static void kaiin_code_input( int *kaiin_code )
{
    int     loop = TRUE;    /* ループフラグ */
    char    work[ 128 ];    /* 入力ワーク   */

    while( loop ) {
        printf( "\n 計測者の会員コードを入力してください" );
        printf( "\n ? " );

        /* 会員コード入力 */
        work[ 0 ] = '\0';
        scanf( "%s", work );

        /* ニューメリック・チェック -> 数値以外 ? */
        if( strspn( work, "1234567890" ) < strlen( work ) ) {
            printf( "\n 数値以外が入力されました" );
            continue;
        }

        /* 入力範囲チェック( 0 < kaiin_code <= MEMBER_MAX ) */
        *kaiin_code = atoi( work );
        if( *kaiin_code > MEMBER_MAX || *kaiin_code <= 0 ) {
            printf( "\n 入力ミスです" );
            continue;
        }

        /* 会員コード登録チェック -> 未登録 ? */
        if( codedata_tbl[ *kaiin_code - 1 ] == 0 ) {
            printf( "\n この会員コードは未登録です" );
            continue;
        }
        break;
    }
    return;
}



/************************************/
/* 計測記録入力処理                 */
/*   計測日付入力処理               */
/*                                  */
/*   パラメータ : 入力日付          */
/*   リターン   : なし              */
/************************************/
static void keisoku_date_input( char *keisoku_date )
{
    int     loop = TRUE;    /* ループフラグ  */
    int     chk_date;       /* 日付数値      */
    char    conv[ 3 ];      /* 数値変換用    */
    char    work[ 128 ];    /* 入力ワーク    */

    while( loop ) {
        printf( "\n 日付を入力してください( YYYYMMDD )" );
        printf( "\n ? " );

        /* 日付入力 */
        work[ 0 ] = '\0';
        scanf( "%s", work );

        /* 入力桁数チェック -> 8以外 ? */
        if( strlen( work ) != 8 ) {
            printf( "\n 入力ミスです" );
            continue;
        }

        /* ニューメリック・チェック -> 数値以外 ? */
        if( strspn( work, "1234567890" ) < strlen( work ) ) {
            printf( "\n 数値以外が入力されました" );
            continue;
        }

        /* 月チェック */
        conv[0] = work[4];
        conv[1] = work[5];
        conv[2] = '\0';

        chk_date = atoi( conv );
        if( chk_date > 12 || chk_date < 1 ) {
            printf( "\n 日付( 月 )入力エラーです" );
            continue;
        }

        /* 日チェック */
        conv[0] = work[6];
        conv[1] = work[7];
        conv[2] = '\0';
        chk_date = atoi( conv );
        if( chk_date > 31 || chk_date < 1 ) {
            printf( "\n 日付( 日 )入力エラーです" );
            continue;
        }

        break;
    }

    /* 入力データ セット */
    strcpy(keisoku_date, work);
    return;
}



/************************************/
/* 計測記録入力処理                 */
/*   計測データ入力処理             */
/*                                  */
/*   パラメータ : インデックス      */
/*   リターン   : なし              */
/************************************/
static void keisoku_data_input( int idx )
{
    int     i;                  /* インデックス   */
    int     loop = TRUE;        /* ループフラグ   */
    char    work[ 3 ][ 128 ];   /* 入力ワーク     */

    while( loop ) {
        printf( "\n 運動 %d の計測データを入力してください", idx + 1 );
        printf( "\n   負荷( 999 )  セット( 100 )  回数( 100 )" );
        printf( "\n ? " );

        /* 計測データ入力 */
        work[ 0 ][ 0 ] = '\0';
        work[ 1 ][ 0 ] = '\0';
        work[ 2 ][ 0 ] = '\0';
        scanf( "%s %s %s", work[ 0 ], work[ 1 ], work[ 2 ] );

        for( i = 0; i < 3; i++ ) {

            /* 入力桁数チェック -> 3より大きい ? */
            if( strlen( work[ i ] ) > 3 ) {
                printf( "\n 入力ミスです" );
                break;
            }

            /* ニューメリック・チェック -> 数値以外 ? */
            if( strspn( work[ i ], "1234567890" ) < strlen( work[ i ] ) ) {
                printf( "\n 数値以外が入力されました" );
                break;
            }

            /* 負荷以外の上限チェック -> 100より大きい ? */
            if( i != 0 ) {
                if( atoi( work[ i ] ) > 100 ) {
                    printf( "\n 上限( 100 )を超えています" );
                    break;
                 }
            }
        }

        if( i < 3 ) {
            continue;
        }

        break;
    }

    /* 入力データテーブル セット */
    keisoku_indata[ idx ].huka = atoi( work[ 0 ] );
    keisoku_indata[ idx ].set = atoi( work[ 1 ] );
    keisoku_indata[ idx ].kaisuu = atoi( work[ 2 ] );

    return;
}



/************************************/
/* 計測記録入力処理                 */
/*   入力計測データ 表示処理       */
/*                                  */
/*   パラメータ : 会員コード        */
/*                日付              */
/*   リターン   : なし              */
/************************************/
static void keisoku_data_disp( int kaiin_code, char *keisoku_date )
{
    int     i;      /* インデックス      */

    printf( "\n ** 入力計測値データ **" );
    printf( "\n 会員コード %3d", kaiin_code );
    printf( "\n 日付       %4.4s-%2.2s-%2.2s", 
        ( keisoku_date + 0 ), ( keisoku_date + 4 ), ( keisoku_date + 6 ) );

    printf( "\n\n 運動   負荷  セット   回数" );

    for( i = 0; i < 5; i++ ) {
        printf( "\n   %d     %3d    %3d     %3d", i + 1, 
            keisoku_indata[ i ].huka,
            keisoku_indata[ i ].set,
            keisoku_indata[ i ].kaisuu );
    }

    return;
}



/************************************/
/* 計測記録入力処理                 */
/*   運動指数計算処理               */
/*                                  */
/*   パラメータ : 運動指数          */
/*   リターン   : なし              */
/************************************/
static void undou_sisuu_keisan( int *undou_sisuu )
{
    int     i;              /* インデックス  */
    double  sisuu;          /* 計算ワーク    */
    double  sisuu_total;    /* 計算値合計    */
    static  double  huka_sisuu[ 5 ] = { 0.24, 0.36, 0.52, 1.05, 2.13 };

    sisuu_total = 0.0;
    for( i = 0; i < 5; i++ ) {

        /* 回数 1以下 ? */
        if( keisoku_indata[ i ].kaisuu <= 1 ) {
            continue;
        }

        sisuu = huka_sisuu[ i ] * (double)keisoku_indata[ i ].huka * 
               (double)keisoku_indata[ i ].set *
               ((pow( (double)keisoku_indata[ i ].kaisuu, 2.0 )) /
               ((double)keisoku_indata[ i ].kaisuu - 1.0));

        /* シグマ(累計)の計算 */
        sisuu_total += sisuu;
    }

    /* 平方根の算出 */
    *undou_sisuu = (int)sqrt( sisuu_total );

    return;
}



/************************************/
/* 計測記録入力処理                 */
/*   個人計測データ表 更新処理     */
/*                                  */
/*   パラメータ : 会員コード        */
/*                日付              */
/*                運動指数          */
/*   リターン   : 0:OK              */
/*               -1:NG              */
/************************************/
static int kojin_data_update( int kaiin_code, char *keisoku_date, int undou_sisuu )
{
    int     ret;                        /* リターンコード         */
    long    fptr;                       /* 計測データポインタ     */
    FILE    *fp;                        /* ファイルポインタ       */
    char    *fname = KEISOKU_TBL_NAME;  /* 計測データ表ファイル   */
    int     i;                          /* インデックス           */

    /* 1回目 ? */
    if( kojin_keisoku_tbl.count <= 0 ) {
        strcpy( kojin_keisoku_tbl.first_date, keisoku_date );
        kojin_keisoku_tbl.first_data = undou_sisuu;

        strcpy( kojin_keisoku_tbl.max_date, keisoku_date );
        kojin_keisoku_tbl.max_data = undou_sisuu;
    }
    else {

        /* 最高記録 ? */
        if( kojin_keisoku_tbl.max_data < undou_sisuu ) {
            strcpy( kojin_keisoku_tbl.max_date, keisoku_date );
            kojin_keisoku_tbl.max_data = undou_sisuu;
        }
        for (i = sizeof kojin_keisoku_tbl.soku_data / sizeof(int) - 1; i > 0; i-- )
            kojin_keisoku_tbl.soku_data[ i ] = kojin_keisoku_tbl.soku_data[ i - 1 ];
    }

    strcpy( kojin_keisoku_tbl.soku_date, keisoku_date );
    kojin_keisoku_tbl.soku_data[ 0 ] = undou_sisuu;
    kojin_keisoku_tbl.count++;

    /* 計測データ表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname, "r+b" )) == NULL ) {
        printf( "\n 計測データ表ファイル OPEN エラー" );
        return NG;
    }

    /* 該当データポインタ セット */
    fptr = ( codedata_tbl[ kaiin_code - 1 ] - 1 ) * 
        sizeof( struct KEISOKU_TBL );

    /* 計測データ表ファイル SEEK -> OK でない ? */
    if( (ret = fseek( fp, fptr, SEEK_SET )) != OK ) {
        printf( "\n 計測データ表ファイル SEEK エラー" );

        /* 計測データ表ファイル CLOSE */
        fclose( fp );
        return NG;
    }

    /* 計測データ表ファイル WRITE -> 1以外 ? */
    if( (ret = fwrite( (char *)&kojin_keisoku_tbl, sizeof( kojin_keisoku_tbl ),
               1, fp )) != 1 ) {
        printf( "\n 計測データ表ファイル WRITE エラー" );
        ret = NG;
    }
    else {
        ret = OK;
    }

    /* 計測データ表ファイル CLOSE */
    fclose( fp );

    return ret;
}



/************************************/
/* 計測記録入力処理                 */
/*   計測結果順位ソート・表示処理   */
/*                                  */
/*   パラメータ : なし              */
/*   リターン   : 0:OK              */
/*               -1:NG              */
/************************************/
static int keisoku_rank( void )
{
    int     ret;                        /* リターンコード         */
    int     i;                          /* インデックス           */
    FILE    *fp;                        /* ファイルポインタ       */
    char    *fname = KEISOKU_TBL_NAME;  /* 計測データ表ファイル   */

    /* 計測データ表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname, "rb" )) == NULL ) {
        printf( "\n 計測データ表ファイル OPEN エラー" );
        return NG;
    }

    i = 0;
    for( ; ; ) {

        /* 計測データ表ファイル READ -> 1以外 ? */
        if( (ret = fread( (char *)&sort_keisoku_tbl[ i ],
                   sizeof( struct KEISOKU_TBL ), 1, fp )) != 1 ) {

            /* READ エラー ? */
            if( ferror( fp ) != 0 ) {
                printf( "\n 計測データ表ファイル READ エラー" );
                ret = NG;
            }
            else {
                /* ファイル EOF でない ? */
                if( feof( fp ) == 0 ) {
                    printf( "\n 計測データ表ファイル READ エラー" );
                    ret = NG;
                }
                else {
                    ret = OK;
                }
            }
        }

        /* READ エラー ? */
        if( ret == NG ) {
            break;
        }

        /* 計測データあり ? */
        if( sort_keisoku_tbl[ i ].count != 0 ) {
            i++;
        }

        /* eof ? */
        if( ret == OK ) {
            break;
        }
    }

    /* 計測データ表ファイル CLOSE */
    fclose( fp );

    if( ret == OK ) {
        /* 計測データソート */
        keisoku_data_sort( i );
        /* 計測データソート結果表示 */
        keisoku_sort_disp( i );
    }

    return ret;
}



/************************************/
/* 計測記録入力処理                 */
/*   計測結果順位ソート処理         */
/*                                  */
/*   パラメータ : 計測データ件数    */
/*   リターン   : なし              */
/************************************/
static void keisoku_data_sort( int cnt )
{
    int     i;                      /* インデックス      */
    int     j;                      /* インデックス      */
    struct  KEISOKU_TBL  work;      /* スワップ用エリア  */

    /* データソート */
    for( i = 0; i < cnt - 1; i++ ) {
        for( j = i + 1; j < cnt; j++ ) {
            if( sort_keisoku_tbl[ i ].max_data < 
                sort_keisoku_tbl[ j ].max_data ) {

                work = sort_keisoku_tbl[ i ];
                sort_keisoku_tbl[ i ] = sort_keisoku_tbl[ j ];
                sort_keisoku_tbl[ j ] = work;
            }
        }
    }
    return;
}



/************************************/
/* 計測記録入力処理                 */
/*   計測結果順位表示処理           */
/*                                  */
/*   パラメータ : 計測データ件数    */
/*   リターン   : なし              */
/************************************/
static void keisoku_sort_disp( int cnt )
{
    int     i;  /* インデックス  */

    printf( "\n\n ** 順位表 **" );
    printf( "\n 順位 会員コード 最高データ     日付" );

    for( i = 0; i < cnt; i++ ) {

        /* 10位まで表示する */
        if( i >= 10 ) {
            break;
        }

        printf( "\n   %2d   %3d         %4d     %4.4s-%2.2s-%2.2s", i + 1,
            sort_keisoku_tbl[ i ].kaiin_code,
            sort_keisoku_tbl[ i ].max_data,
            &sort_keisoku_tbl[ i ].max_date[ 0 ],
            &sort_keisoku_tbl[ i ].max_date[ 4 ],
            &sort_keisoku_tbl[ i ].max_date[ 6 ] );
    }
    return;
}
nyuukai.c

コード:

#include <stdio.h>
#include <string.h>

#include "common.h"
#include "main.h"
#include "nyuukai.h"

extern int akicode_tbl[ MEMBER_MAX + 1 ];        /* 空きコード表          */
extern int codedata_tbl[ MEMBER_MAX ];           /* コード・データ対照表  */
extern struct KEISOKU_TBL kojin_keisoku_tbl;     /* 個人別計測データ表    */

/***********************************/
/* 入会登録処理                    */
/*   メインルーチン                */
/*                                 */
/*   パラメータ : なし             */
/*   リターン   : 0:OK             */
/*               -1:NG             */
/***********************************/
int nyuukai_touroku( void )
{
    int    ret;             /* リターンコード      */
    int    kaiin_code;      /* 登録会員コード      */
    long   fptr;            /* ファイルポインタ    */
    char   msg[ 64 ];       /* メッセージエリア    */

    /* 空きコード表 READ -> NG ? */
    if( (ret = akicode_tbl_read( )) == NG ) {
        return ret;
    }

    /* 空きコードあり ? */
    if( akicode_tbl[ 0 ] <= 0 ) {
        printf( "\n 残念ながらただ今メンバーの空きがありません\n" );
        ret = OK;
        return ret;
    }

    /* 空きコード確認 */
    sprintf( msg, "\n 会員コードは %d です。よろしいですか( Y/N )", akicode_tbl[ 1 ] );

    if( (ret = kakunin_input( msg )) == OK ) {
        /* 登録会員コード退避 */
        kaiin_code = akicode_tbl[ 1 ];

        /* 空きコード表更新 -> OK ? */
        if( (ret = akicode_tbl_update( )) == OK ) {

            /* 計測データ表追加 -> OK ? */
            if( (ret = keisoku_tbl_add( &fptr, kaiin_code )) == OK ) {

                /* コード・データ対照表更新 */
                ret = codedata_tbl_update( kaiin_code, fptr );
            }
        }
    }

    if( ret == OK ) {
        printf( "\n 入会登録処理が終了しました" );
    }

    return ret;
}



/************************************/
/* 入会登録処理                     */
/*   空きコード表 更新処理         */
/*                                  */
/*   パラメータ : なし              */
/*   リターン   : 0:OK              */
/*               -1:NG              */
/************************************/
static int akicode_tbl_update( void )
{
    int     ret;                        /* リターンコード       */
    int     i;                          /* インデックス         */
    int     cnt;                        /* 空きコード件数       */
    FILE    *fp;                        /* ファイルポインタ     */
    char    *fname = AKICODE_TBL_NAME;  /* 空きコード表ファイル */

    /* 空きコード件数セット */
    cnt = akicode_tbl[ 0 ];

    /* 空きコード編集 */
    for( i = 1; i < cnt; i++ ) {
        if( akicode_tbl[ i + 1 ] == 0 ) {
            break;
        }
        akicode_tbl[ i ] = akicode_tbl[ i + 1 ];
    }

    akicode_tbl[ i ] = 0;

    /* 空きコード件数セット */
    akicode_tbl[ 0 ] = cnt - 1;

    /* 空きコード表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname, "w+b" )) == NULL ) {
        printf( "\n 空きコード表ファイル OPEN エラー" );
        return NG;
    }

    /* 空きコード表ファイル WRITE -> 1以外 ? */
    if( (ret = fwrite( (char *)akicode_tbl,
               sizeof( int ) * (akicode_tbl[ 0 ] + 1), 1, fp )) != 1 ) {
        printf( "\n 空きコード表ファイル WRITE エラー" );
        ret = NG;
    }
    else {
        ret = OK;
    }

    /* 空きコード表ファイル CLOSE */
    fclose( fp );

    return ret;
}



/************************************/
/* 入会登録処理                     */
/*   計測コード表 追加処理         */
/*                                  */
/*   パラメータ : 計測データポインタ*/
/*                登録会員コード    */
/*   リターン   : 0:OK              */
/*               -1:NG              */
/************************************/
static int keisoku_tbl_add( long *fptr, int kaiin_code )
{
    int     ret;                        /* リターンコード         */
    FILE    *fp;                        /* ファイルポインタ       */
    char    *fname = KEISOKU_TBL_NAME;  /* 計測データ表ファイル   */

    /* 計測データ表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname, "a+b" )) == NULL ) {
        printf( "\n 計測データ表ファイル OPEN エラー" );
        return NG;
    }

    /* 計測データ表ファイル SEEK -> OK でない ? */
    if( (ret = fseek( fp, 0L, SEEK_END )) != OK ) {
        printf( "\n 計測データ表ファイル SEEK エラー" );
        /* 計測データ表ファイル CLOSE */
        fclose( fp );
        return NG;
    }

    /* ファイルポインタ取得 */
    *fptr = ftell( fp );

    /* 計測データ表クリア */
    kojin_keisoku_tbl = init_kojin_keisoku_tbl();

    /* 会員コードセット */
    kojin_keisoku_tbl.kaiin_code = kaiin_code;

    /* 計測データ表ファイル WRITE -> 1以外 ? */
    if( (ret = fwrite( (char *)&kojin_keisoku_tbl, sizeof( kojin_keisoku_tbl ),
               1, fp )) != 1 ) {
        printf( "\n 計測データ表ファイル WRITE エラー" );
        ret = NG;
    }
    else {
        ret = OK;
    }

    /* 計測データ表ファイル CLOSE */
    fclose( fp );

    return ret;
}



/*****************************************/
/* 入会登録処理                        */
/*   コード・データ対照表 更新処理      */
/*                                       */
/*   パラメータ : 登録会員コード         */
/*                計測データポインタ     */
/*   リターン   : 0:OK                   */
/*               -1:NG                   */
/*****************************************/
static int codedata_tbl_update( int kaiin_code, long fptr )
{
    int     ret;                        /* リターンコード                */
    FILE    *fp;                        /* ファイルポインタ              */
    char    *fname = CODEDATA_TBL_NAME; /* コード・データ対照表ファイル  */

    /* コード・データ対照表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname, "r+b" )) == NULL ) {
        printf( "\n コード・データ対照表ファイル OPEN エラー" );
        return NG;
    }

    /* コード・データ対照表ファイル READ -> 1以外 ? */
    if( (ret = fread( (char *)codedata_tbl, sizeof( codedata_tbl ), 1, fp ) )
               != 1 ) {
        printf( "\n コード・データ対照表ファイル READ エラー" );
        ret = NG;
    }
    else {
        /* 該当データポインタセット */
        codedata_tbl[ kaiin_code - 1 ] = 
            (int)( (fptr / sizeof( struct KEISOKU_TBL )) + 1 );

        /* ファイルポインタを先頭に SEEK -> OK でない ? */
        if( (ret = fseek( fp, 0L, SEEK_SET )) != OK ) {
            printf( "\n コード・データ対照表ファイル SEEK エラー" );

            /* コード・データ対照表ファイル CLOSE */
            fclose( fp );
            return NG;
        }

        /* コード・データ対照表ファイル WRITE -> 1以外 ? */
        if( (ret = fwrite( (char *)codedata_tbl, sizeof( codedata_tbl ), 1,
                   fp )) != 1 ) {
            printf( "\n コード・データ対照表ファイル WRITE エラー" );
            ret = NG;
        }
        else {
            ret = OK;
        }
    }

    /* コード・データ対照表ファイル CLOSE */
    fclose( fp );

    return ret;
}
sakujyo.c

コード:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "common.h"
#include "main.h"
#include "sakujyo.h"

extern int akicode_tbl[ MEMBER_MAX + 1 ];      /* 空きコード表           */
extern int codedata_tbl[ MEMBER_MAX ];         /* コード・データ対照表   */
extern struct KEISOKU_TBL kojin_keisoku_tbl;   /* 個人別計測データ表     */

/************************************/
/* 登録削除処理                     */
/*   メインルーチン                 */
/*                                  */
/*   パラメータ : なし              */
/*   リターン   : 0:OK              */
/*               -1:NG              */
/************************************/
int touroku_sakujyo( void )
{
    int     ret;            /* リターンコード   */
    int     loop = TRUE;    /* ループフラグ     */
    int     kaiin_code;     /* 削除会員コード   */
    char    work[ 128 ];    /* 入力ワーク       */

    while( loop ) {
        printf( "\n 退会者の会員コードを入力してください" );
        printf( "\n ? " );

        /* 会員コード入力 */
        work[ 0 ] = '\0';
        scanf( "%s", work );

        /* ニューメリック・チェック -> 数値以外 ? */
        if( strspn( work, "1234567890" ) < strlen( work ) ) {
            printf( "\n 数値以外が入力されました" );
            continue;
        }

        /* 入力範囲チェック -> ( 0 < kaiin_code <= MEMBER_MAX ) ? */
        kaiin_code = atoi( work );
        if( kaiin_code > MEMBER_MAX || kaiin_code <= 0 ) {
            printf( "\n 入力ミスです" );
            continue;
        }

        /* コード・データ対照表削除 -> OK ? */
        if( (ret = codedata_tbl_delete( kaiin_code )) == OK ) {
            /* 空きコード表追加 -> OK ? */
            if( (ret = akicode_tbl_add( kaiin_code )) == OK ) {
                /* メインに戻る */
                loop = FALSE;
            }
        }
        else {
            /* メインに戻る */
            loop = FALSE;
        }
    }

    if( ret == OK ) {
        printf( "\n 入会登録削除処理が終了しました" );
    }

    return ret;
}



/************************************/
/* 登録削除処理                     */
/*   コード・データ対照表 削除処理 */
/*                                  */
/*   パラメータ : 削除会員コード    */
/*   リターン   : 0:OK              */
/*                1:CANCEL          */
/*               -1:NG              */
/************************************/
static int codedata_tbl_delete( int kaiin_code )
{
    int     ret;                        /* リターンコード                */
    int     i;                          /* インデックス                  */
    char    msg[ 64 ];                  /* メッセージエリア              */
    FILE    *fp;                        /* ファイルポインタ              */
    char    *fname = CODEDATA_TBL_NAME; /* コード・データ対照表ファイル  */

    /* コード・データ対照表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname, "r+b" )) == NULL ) {
        printf( "\n コード・データ対照表ファイル OPEN エラー" );
        return NG;
    }

    /* コード・データ対照表ファイル READ -> 1以外 ? */
    if( (ret = fread( (char *)codedata_tbl, sizeof( codedata_tbl ), 1, fp ) )
               != 1 ) {
        /* READ エラー */
        printf( "\n コード・データ対照表ファイル READ エラー" );

        /* コード・データ対照表ファイル CLOSE */
        fclose( fp );
        return NG;
    }

    /* 会員登録チェック -> 未登録 ? */
    if( codedata_tbl[ kaiin_code - 1 ] == 0 ) {
        printf( "\n この会員コードは未登録です" );

        /* コード・データ対照表ファイル CLOSE */
        fclose( fp );
        return CANCEL;
    }

    /* 計測データ表 READ -> NG ? */
    if( (ret = kojin_data_read( kaiin_code )) == NG ) {
        /* コード・データ対照表ファイル CLOSE */
        fclose( fp );
        return ret;
    }

    /* 計測データ表示 */
    kojin_data_disp( kaiin_code, "\n ** 削除データ **" );

    /* 計測データ表削除確認 */
    sprintf( msg, "\n\n 上のデータを削除します。よろしいですか( Y/N )" );

    if( (ret = kakunin_input( msg )) == OK ) {

        /* 計測データ表削除 -> OK ? */
        if( (ret = kojin_data_delete( kaiin_code )) == OK ) {

            /* 計測データポインタ更新 */
            for( i = 0; i < MEMBER_MAX; i++ ) {
                if( codedata_tbl[ i ] > codedata_tbl[ kaiin_code - 1 ] ) {
                    codedata_tbl[ i ]--;
                }
            }

            /* 計測データポインタクリア */
            codedata_tbl[ kaiin_code - 1 ] = 0;

            /* コード・データ対照表ファイルの先頭位置に SEEK -> OK ? */
            if( (ret = fseek( fp, 0L, SEEK_SET )) == OK ) {

                /* コード・データ対照表ファイル WRITE -> 1以外 ? */
                if( (ret = fwrite( (char *)codedata_tbl,
                           sizeof( codedata_tbl ),1, fp )) != 1 ) {
                    printf( "\n コード・データ対照表ファイル WRITE エラー" );
                    ret = NG;
                }
                else {
                    ret = OK;
                }
            }
            else {
                printf( "\n コード・データ対照表ファイル SEEK エラー" );
                ret = NG;
            }
        }
    }
    else {
        /* 処理中止 */
        ret = CANCEL;
    }

    /* コード・データ対照表ファイル CLOSE */
    fclose( fp );

    return ret;
}



/************************************/
/* 登録削除処理                     */
/*   個人計測データ表 削除処理     */
/*                                  */
/*   パラメータ : 削除会員コード    */
/*   リターン   : 0:OK              */
/*               -1:NG              */
/************************************/
static int kojin_data_delete( int kaiin_code )
{
    int     ret;                         /* リターンコード                */
    int     i;                           /* インデックス                  */
    FILE    *fp;                         /* 計測データ表ファイルポインタ  */
    FILE    *tmp;                        /* テンポラリファイルポインタ    */
    char    *fname = KEISOKU_TBL_NAME;   /* 計測データ表ファイル          */
    char    *tmpfl = "keisoku.tmp";      /* テンポラリファイル            */

    /* 計測データ表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname, "rb" )) == NULL ) {
        printf( "\n 計測データ表ファイル OPEN エラー" );
        return NG;
    }

    /* テンポラリファイル OPEN -> NULL ? */
    if( (tmp = fopen( tmpfl, "w+b" )) == NULL ) {
        printf( "\n テンポラリファイル OPEN エラー" );
        fclose( fp );
        return NG;
    }

    i = 0;
    for( ; ; ) {

        /* 計測データ表ファイル READ -> 1以外 ? */
        if( (ret = fread( (char *)&kojin_keisoku_tbl,
                   sizeof( kojin_keisoku_tbl ), 1, fp )) != 1 ) {

            /* READ エラー ? */
            if( ferror( fp ) != 0 ) {
                printf( "\n 計測データ表ファイル READ エラー" );
                ret = NG;
            }
            else {
                /* ファイル EOF でない ? */
                if( feof( fp ) == 0 ) {
                    printf( "\n 計測データ表ファイル READ エラー" );
                    ret = NG;
                }
                else {
                   ret = OK;
                }
            }
            break;
        }

        /* 削除データ ? */
        if( kaiin_code == kojin_keisoku_tbl.kaiin_code ) {
            continue;
        }

        /* テンポラリファイル WRITE -> 1以外 ? */
        if( (ret = fwrite( (char *)&kojin_keisoku_tbl,
                   sizeof( kojin_keisoku_tbl ), 1, tmp )) != 1 ) {
            printf( "\n 計測データ表ファイル WRITE エラー" );
            ret = NG;
            break;
        }
        i++;
    }

    /* テンポラリファイル CLOSE */
    fclose( tmp );

    /* 計測データ表ファイル CLOSE */
    fclose( fp );

    /* 正常終了 ? */
    if( ret == OK ) {

        /* 計測データ表ファイル DELETE -> 0以外 ? */
        if( (ret = remove( fname )) != 0 ) {
            printf( "\n 計測データ表ファイル削除エラー" );
            ret = NG;
        }
        else {
            /* 書込みデータあり ? */
            if( i > 0 ) {

                /* テンポラリファイルを計測データ表ファイルにリネームする -> 0以外 ? */
                if( (ret = rename( tmpfl, fname )) != 0 ) {
                    printf( "\n 計測データ表ファイルリネームエラー" );
                    ret = NG;
                }
            }
            else {
                /* テンポラリファイル削除 */
                remove( tmpfl );
            }
        }
    }
    else {
        /* テンポラリファイル削除 */
        remove( tmpfl );
    }

    return ret;
}



/************************************/
/* 登録削除処理                     */
/*   空きコード表 追加処理         */
/*                                  */
/*   パラメータ : 削除会員コード    */
/*   リターン   : 0:OK              */
/*               -1:NG              */
/************************************/
static int akicode_tbl_add( int kaiin_code )
{
    int     ret;                        /* リターンコード        */
    int     cnt;                        /* 空きコード件数        */
    FILE    *fp;                        /* ファイルポインタ      */
    char    *fname = AKICODE_TBL_NAME;  /* 空きコード表ファイル  */

    /* 空きコード表 READ -> NG ? */
    if( (ret = akicode_tbl_read( )) == NG ) {
        return ret;
    }

    /* 空きコード件数セット */
    cnt = akicode_tbl[ 0 ];

    /* 空きコードテーブルセット */
    akicode_tbl[ cnt + 1 ] = kaiin_code;

    /* 空きコード件数セット */
    akicode_tbl[ 0 ] = cnt + 1;

    /* 空きコード表ファイル OPEN -> NULL ? */
    if( (fp = fopen( fname, "w+b" )) == NULL ) {
        printf( "\n 空きコード表ファイル OPEN エラー" );
        return NG;
    }

    /* 空きコード表ファイル WRITE -> 1以外 ? */
    if( (ret = fwrite( (char *)akicode_tbl,
               sizeof( int ) * ( akicode_tbl[ 0 ] + 1 ), 1, fp )) != 1 ) {
        printf( "\n 空きコード表ファイル WRITE エラー" );
        ret = NG;
    }
    else {
        ret = OK;
    }

    /* 空きコード表ファイル CLOSE */
    fclose( fp );

    return ret;
}
ヘッダファイル
main.h

コード:

static int  codedata_tbl_create( void );
static int  akicode_tbl_create( void );

int  akicode_tbl_read( void );
int  kakunin_input( char *msg );
int  kojin_data_read( int kaiin_code );
void kojin_data_disp( int kaiin_code, char *msg );
struct KEISOKU_TBL init_kojin_keisoku_tbl( void );
keisoku.h

コード:

int  keisoku_input( void );

static int  codedata_tbl_read( void );
static void kaiin_code_input( int *kaiin_code );
static void keisoku_date_input( char *keisoku_date );
static void keisoku_data_input( int idx );
static void keisoku_data_disp( int kaiin_code, char *keisoku_date );
static void undou_sisuu_keisan( int *undou_sisuu );
static int  kojin_data_update( int kaiin_code, char *keisoku_date, int undou_sisuu );
static int  keisoku_rank( void );
static void keisoku_data_sort( int cnt );
static void keisoku_sort_disp( int cnt );
nyuukai.h

コード:

int  nyuukai_touroku( void );

static int  akicode_tbl_update( void );
static int  keisoku_tbl_add( long *fptr, int kaiin_code );
static int  codedata_tbl_update( int kaiin_code, long fptr );
sakujyo.h

コード:

int  touroku_sakujyo( void );

static int  codedata_tbl_delete( int kaiin_code );
static int  kojin_data_delete( int kaiin_code );
static int  akicode_tbl_add( int kaiin_code );
commom.h

コード:

#define MEMBER_MAX          200             /* メンバー数 MAX                   */
#define AKICODE_TBL_NAME    "akicode.tbl"   /* 空きコード表ファイル名           */
#define CODEDATA_TBL_NAME   "codedata.tbl"  /* コード・データ対照表ファイル名   */
#define KEISOKU_TBL_NAME    "keisoku.tbl"   /* 計測データ表ファイル名           */

#define  TRUE          1    /* 真            */
#define  FALSE         0    /* 偽            */
#define  OK            0    /* 正常          */
#define  CANCEL        1    /* 処理中止      */
#define  NG           -1    /* 異常          */

/* 計測データテーブル */
struct   KEISOKU_TBL {
    int  kaiin_code;       /* 会員コード     */
    int  count;            /* 計測回数       */
    char first_date[ 9 ];  /* 初回日付       */
    int  first_data;       /* 初回データ     */
    char max_date[ 9 ];    /* 最高記録日付   */
    int  max_data;         /* 最高記録データ */
    char soku_date[ 9 ];   /* 最新計測日付   */
    int  soku_data[ 10 ];  /* 計測データ     */
};

/* 入力計測データ */
struct   KEISOKU_INPUT {
    int  huka;             /* 負荷   */
    int  set;              /* セット */
    int  kaisuu;           /* 回数   */
};

長文すみません
よろしくお願いします。

Re: exeファイルの作成方法について

Posted: 2014年11月19日(水) 14:21
by box
しまった。エラーメッセージを伏せ字にしないで全部見せてください、
というのを忘れていた。

というわけで、
○○○○
の部分を具体的に書いた上で、エラーメッセージを全部見せてください。

Re: exeファイルの作成方法について

Posted: 2014年11月19日(水) 21:17
by みけCAT
サンプル問題 - 検定試験について - C言語プログラミング能力認定試験│資格検定のサーティファイ│あなたのスキルアップを応援します|
の1級のプログラムですか?
出典を書かずに無断転載をするのはあまり良くないことだと思います。

Re: exeファイルの作成方法について

Posted: 2014年11月20日(木) 16:46
by ハッセス
あ~やっぱりそうですか
すみません、上記の書き込みを削除したいのですが、どうすればいいでしょうか??

Re: exeファイルの作成方法について

Posted: 2014年11月20日(木) 17:51
by ISLe()
ハッセス さんが書きました:bcc32 〇〇〇〇.cと入力して実行ファイルを作るやり方で、
ソースファイルひとつずつコンパイルしているのでは?

Re: exeファイルの作成方法について

Posted: 2014年11月21日(金) 22:09
by Dixq (管理人)
ISLeさんの仰る通りなら、こちらは参考になりませんか?
https://www.google.co.jp/search?q=bcc32 ... 3&ie=UTF-8
また、一度書き込んだ普通削除できません。
当SNSに登録してもらえれば編集やファイル添付等できるようになります。

Re: exeファイルの作成方法について

Posted: 2014年11月21日(金) 23:15
by ハッセス
出来ました!ありがとうございます!
全部いっぺんにコンパイルすればよかったんですね!

ちなみに、登録するのはユーザー登録から行えばよろしいでしょうか?

Re: exeファイルの作成方法について

Posted: 2014年11月21日(金) 23:21
by Dixq (管理人)
解決してよかったですね。

はい、そこから登録できます。