【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19992

共有体_コンパイルエラー
投稿者---Q(2005/02/16 10:50:40)


共有体の部分でコンパイルエラーが出現します。
どうすればいいでしょうか?
(下記エラー参照)
'b_data' : 'body' のメンバではありません。
f0503145.c(20) : 'body' の宣言を確認してください。

(下記ソース)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* ノード(レコード)の定義 */  
typedef struct head{
    char    id;     /* 'H' */
    int     ninzu;        /* レコード件数 */
    double  goukei[3];         /* 科目別合計点数 */
}HEAD;
typedef struct body{
    char        id;    /* 'B' */
    char       kumi[5];      /* クラス */
    long int    bango;   /* 学籍番号(入学年(西暦)+連番(1-999)) */
    char       namae[20];  /* 名前 */
    short int   ten[3];         /* 科目別点数 */
}BODY;
typedef struct foot{
    char    id;     /* 'E' */
}FOOT;
typedef union record{
    struct head h_data;      /* ヘッダー */
    struct body b_data;      /* 明細データ */
    struct foot f_data;      /* フッター */
}RECORD;

FILE *fp;                  /* ファイルポインタ の宣言(グローバル宣言) */

void file_header_update(BODY);
void file_data_write(BODY);


void main(int argc, char **argv)
{

    BODY    data;
    RECORD  rec;
    int  i;
    
    if (argc != 2){
        printf("コマンドライン引数に誤りがあります。\n");
        printf("Usage:EXEname filename\n");
        exit(EXIT_FAILURE);
    }
    
    /* ファイルオープン */
    if ( (fp = fopen(argv[1],"r+b")) == NULL){
        /*ファイルが存在しない場合は作成する*/
        fp = fopen(argv[1],"w+b");
        /*ヘッダーレコード作成*/
        rec.h_data.id = 'H';
        rec.h_data.ninzu = 0;
        rec.h_data.goukei[0] = 0;
        rec.h_data.goukei[1] = 0;
        rec.h_data.goukei[2] = 0;
        /*ヘッダーレコード書込*/
        fseek(fp,0,SEEK_SET);
        fwrite(&rec,sizeof(RECORD),1,fp);
    }
    
    while (printf("クラスを入力して下さい(CTRL+Z:終了)→"), gets(data.kumi) != NULL){
        /* データ入力 */
        printf("学籍番号を入力して下さい→");
        scanf("%ld",&data.bango);
        rewind(stdin);                /* キーボードバッファクリア */
        printf("名前を入力して下さい→");
        gets(data.namae);
        printf("科目別得点を入力して下さい(得点1 得点2 得点3)→");
        scanf("%d %d %d",&data.ten[0],&data.ten[1],&data.ten[2]);
        rewind(stdin);                /* キーボードバッファクリア */
        /* 明細レコード出力 */
        file_data_write(data);
        /* ヘッダーレコード更新 */
        //file_header_update(data);
    }
    
    /*フッターレコード作成*/
    rec.f_data.id      = 'E';
    /*フッターレコード書込*/
    fseek(fp,0,SEEK_END);
    fwrite(&rec,sizeof(RECORD),1,fp);
    
    
    /* ファイルクローズ */
    fclose(fp);
}

/*
*  ヘッダーレコードの更新関数
*/
void file_header_update(BODY data)
{

    RECORD  rec;
    int  i;
    
    /* 先頭(ヘッダー)レコードの読込 */
    fseek(fp,0,SEEK_SET);                     /* ファイルの先頭へ */
    if (fread(&rec,sizeof(RECORD),1,fp) != 1){
        printf("ヘッダーレコード読込失敗!\n");
        exit(EXIT_FAILURE);
    }
    
    /* ヘッダー情報の更新 */
    
    while(fread(&rec, sizeof(RECORD),1,fp),
          data.b_data.namae != rec.b_data.namae){
          data.b_data.ten[0] += rec.b_data.ten[0];
          data.b_data.ten[1] += rec.b_data.ten[1];
          data.b_data.ten[2] += rec.b_data.ten[2];
    }
    fseek(fp,0,SEEK_SET);                     /* ファイルの先頭へ */
    if (fread(&rec,sizeof(RECORD),1,fp) != 1){
        printf("ヘッダーレコード読込失敗!\n");
        exit(EXIT_FAILURE);
    }
    rec.h_data.ninzu++;
    rec.h_data.goukei[0] = data.b_data.ten[0];
    rec.h_data.goukei[1] = data.b_data.ten[1];
    rec.h_data.goukei[2] = data.b_data.ten[2];
    /*ヘッダーレコード書込*/
    if (fwrite(&rec,sizeof(RECORD),1,fp) != 1){
        printf("ヘッダーレコード読込失敗!\n");
        exit(EXIT_FAILURE);
    }
    
}

/*
*  明細レコードの出力関数
*/
void file_data_write(BODY data)
{

    RECORD  rec;
    int     i;
    long int putptr;
    
    /* 最終レコードの読込 */
    fseek(fp,(-1)*sizeof(RECORD),SEEK_END);   /* 最終レコードへ */
    if (fread(&rec,sizeof(RECORD),1,fp) != 1){
        printf("最終レコード読込失敗!\n");
        exit(EXIT_FAILURE);
    }

    if(rec.f_data.id = 'E'){
        fseek(fp,(-1)*sizeof(RECORD),SEEK_END);
    }
    else{
        fseek(fp,0,SEEK_END);
    }
    fwrite(&data,sizeof(RECORD),1,fp);
    
    
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:共有体_コンパイルエラー 19994 kiraku 2005/02/16 12:05:09
<子記事> Re:共有体_コンパイルエラー 19995 Craft 2005/02/16 12:38:26
<子記事> Re:共有体_コンパイルエラー 20015 南野骨茶 2005/02/16 20:27:38


No.19994

Re:共有体_コンパイルエラー
投稿者---kiraku(2005/02/16 12:05:09)


>共有体の部分でコンパイルエラーが出現します。
>どうすればいいでしょうか?
>(下記エラー参照)
>'b_data' : 'body' のメンバではありません。
>f0503145.c(20) : 'body' の宣言を確認してください。

data.b_data が記述されている部分を全てコメントアウトすれば、
無事コンパイルは通ります。

# 警告出ますけどね。



この投稿にコメントする

削除パスワード

No.20053

Re:共有体_コンパイルエラー
投稿者---Q児(2005/02/17 18:21:32)


回答ありがとうございます。
b_dataを省くとコンパイルエラーが解消されました。


この投稿にコメントする

削除パスワード

No.19995

Re:共有体_コンパイルエラー
投稿者---Craft(2005/02/16 12:38:26)


>共有体の部分でコンパイルエラーが出現します。
>どうすればいいでしょうか?
>(下記エラー参照)
>'b_data' : 'body' のメンバではありません。
>f0503145.c(20) : 'body' の宣言を確認してください。

b_data メンバをもっているのは RECORD 共用体ですが、
file_header_updateの引数のdataは、
>void file_header_update(BODY data)
のとおりBODY構造体で宣言されてます。

BODY構造体にはb_dataメンバがないので掲示されたソースにある、data.b_data とかかれている部分が全てコンパイルエラーになります。
> data.b_data.namae != rec.b_data.namae){
> data.b_data.ten[0] += rec.b_data.ten[0];
> data.b_data.ten[1] += rec.b_data.ten[1];
> data.b_data.ten[2] += rec.b_data.ten[2];


この投稿にコメントする

削除パスワード

No.20051

Re:共有体_コンパイルエラー
投稿者---Q児(2005/02/17 18:19:00)


回答ありがとうございます。
b_dataを省くとコンパイルエラーが解消されました。




この投稿にコメントする

削除パスワード

No.20015

Re:共有体_コンパイルエラー
投稿者---南野骨茶(2005/02/16 20:27:38)


>共有体の部分でコンパイルエラーが出現します。

C言語に共有体という概念は存在しません。
共用体ならば存在します。
この機会に、正確な用語を使うようにしましょう。


この投稿にコメントする

削除パスワード

No.20052

Re:共有体_コンパイルエラー
投稿者---Q児(2005/02/17 18:20:33)


>C言語に共有体という概念は存在しません。
>共用体ならば存在します。
回答ありがとうございます。
今まで(先週習った)共有体だと思っていました。
以後、気をつけます。



この投稿にコメントする

削除パスワード

No.20067

永久ループ(プログラムがうまく処理されない)
投稿者---Q(2005/02/18 10:44:29)


プログラムを実行すると永久ループします。
私の頭の中ではうまくできているのですが、一体どこが悪いのでしょうか?
回答のほどよろしくお願いいたします。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* ノード(レコード)の定義 */  
typedef struct head{
    char    id;     /* 'H' */
    int     ninzu;        /* レコード件数 */
    double  goukei[3];         /* 科目別合計点数 */
}HEAD;
typedef struct body{
    char        id;    /* 'B' */
    char       kumi[5];      /* クラス */
    long int    bango;   /* 学籍番号(入学年(西暦)+連番(1-999)) */
    char       namae[20];  /* 名前 */
    short int   ten[3];         /* 科目別点数 */
}BODY;
typedef struct foot{
    char    id;     /* 'E' */
}FOOT;
typedef union record{
    struct head h_data;      /* ヘッダー */
    struct body b_data;      /* 明細データ */
    struct foot f_data;      /* フッター */
}RECORD;

FILE *fp;                  /* ファイルポインタ の宣言(グローバル宣言) */

void file_header_update(BODY);
void file_data_write(BODY);
void file_display(void);

void main(int argc, char **argv)
{

    BODY    data;
    RECORD  rec;
    int  i;
    
    if (argc != 2){
        printf("コマンドライン引数に誤りがあります。\n");
        printf("Usage:EXEname filename\n");
        exit(EXIT_FAILURE);
    }
    
    /* ファイルオープン */
    if ( (fp = fopen(argv[1],"r+b")) == NULL){
        /*ファイルが存在しない場合は作成する*/
        fp = fopen(argv[1],"w+b");
        /*ヘッダーレコード作成*/
        rec.h_data.id = 'H';
        rec.h_data.ninzu = 0;
        rec.h_data.goukei[0] = 0;
        rec.h_data.goukei[1] = 0;
        rec.h_data.goukei[2] = 0;
        /*ヘッダーレコード書込*/
        fseek(fp,0,SEEK_SET);
        fwrite(&rec.h_data,sizeof(RECORD),1,fp);
    }
    
    
    while (printf("クラスを入力して下さい(CTRL+Z:終了)→"), gets(data.kumi) != NULL){
        /* データ入力 */
        printf("学籍番号を入力して下さい→");
        scanf("%ld",&data.bango);
        rewind(stdin);                /* キーボードバッファクリア */
        printf("名前を入力して下さい→");
        gets(data.namae);
        printf("科目別得点を入力して下さい(得点1 得点2 得点3)→");
        scanf("%d %d %d",&data.ten[0],&data.ten[1],&data.ten[2]);
        rewind(stdin);                /* キーボードバッファクリア */
        /* 明細レコード出力 */
        file_data_write(data);
        /* ヘッダーレコード更新 */
        file_header_update(data);
    }
    
    /*フッターレコード作成*/
    rec.f_data.id      = 'E';
    /*フッターレコード書込*/
    fseek(fp,0,SEEK_END);
    fwrite(&rec,sizeof(RECORD),1,fp);
    
    /*ファイル内容表示*/
    file_display();
    
    /* ファイルクローズ */
    fclose(fp);
}

/*
*  ヘッダーレコードの更新関数
*/
void file_header_update(BODY data)
{

    RECORD  rec;
    int  i;
    
    /* 先頭(ヘッダー)レコードの読込 */
    fseek(fp,0,SEEK_SET);                     /* ファイルの先頭へ */
    if (fread(&rec,sizeof(RECORD),1,fp) != 1){
        printf("ヘッダーレコード読込失敗!\n");
        exit(EXIT_FAILURE);
    }
    
    /* ヘッダー情報の更新 */
    
    while(fread(&rec, sizeof(RECORD),1,fp),
          data.namae != rec.b_data.namae){
          data.ten[0] += rec.b_data.ten[0];
          data.ten[1] += rec.b_data.ten[1];
          data.ten[2] += rec.b_data.ten[2];
    }
    fseek(fp,0,SEEK_SET);                     /* ファイルの先頭へ */
    if (fread(&rec,sizeof(RECORD),1,fp) != 1){
        printf("ヘッダーレコード読込失敗!\n");
        exit(EXIT_FAILURE);
    }
    rec.h_data.ninzu++;
    rec.h_data.goukei[0] = data.ten[0];
    rec.h_data.goukei[1] = data.ten[1];
    rec.h_data.goukei[2] = data.ten[2];
    /*ヘッダーレコード書込*/
    if (fwrite(&rec,sizeof(RECORD),1,fp) != 1){
        printf("ヘッダーレコード読込失敗!\n");
        exit(EXIT_FAILURE);
    }
    
}

/*
*  明細レコードの出力関数
*/
void file_data_write(BODY data)
{

    RECORD  rec;
    int     i;
    long int putptr;
    
    /* 最終レコードの読込 */
    fseek(fp,(-1)*sizeof(RECORD),SEEK_END);   /* 最終レコードへ */
    if (fread(&rec,sizeof(RECORD),1,fp) != 1){
        printf("最終レコード読込失敗!\n");
        exit(EXIT_FAILURE);
    }

    if(rec.f_data.id == 'E'){
        fseek(fp,(-1)*sizeof(RECORD),SEEK_END);
    }
    else{
        fseek(fp,0,SEEK_END);
    }
    fwrite(&data,sizeof(RECORD),1,fp);
    
    
}

/*
*  ファイルの内容表示関数
*/
void file_display(void)
{

    RECORD  rec;
    int  i;
    
    printf("%4s %8s %-20s %5s %5s %5s\n", "クラス", "学籍番号", "名   前", "科目1", "科目2", "科目3");
    /* 明細レコードの1件目読込 */
    fseek(fp,0,SEEK_SET);                     /* ファイルの先頭へ */
    if (fread(&rec,sizeof(RECORD),1,fp) != 1){
        printf("ヘッダーレコード読込失敗!\n");
        exit(EXIT_FAILURE);
    }
    /* 先頭データが最終レコードでなければレコードの内容を表示 */
    while (fread(&rec, sizeof(RECORD), 1, fp), rec.b_data.namae != "E"){
        /* データの表示 */
        printf("%4s %8d %-20s %5d %5d %5d",rec.b_data.kumi, rec.b_data.bango, rec.b_data.namae, rec.b_data.ten[0], rec.b_data.ten[1], rec.b_data.ten[2] );
        printf("\n");
        /* 次レコードの読込 */
    } 
   

    /* 先頭(ヘッダー)レコードの読込 */
    fseek(fp,0,SEEK_SET);                     /* ファイルの先頭へ */
    if (fread(&rec,sizeof(RECORD),1,fp) != 1){
        printf("ヘッダーレコード読込失敗!\n");
        exit(EXIT_FAILURE);
    }
    /* 合計の表示 */
    printf("                                %f %f %f",rec.h_data.goukei[0], rec.h_data.goukei[1], rec.h_data.goukei[2]); 
    printf("\n");
}






この投稿にコメントする

削除パスワード

No.20068

Re:永久ループ(プログラムがうまく処理されない)
投稿者---デバッグ汁(2005/02/18 11:06:42)


>プログラムを実行すると永久ループします。
>私の頭の中ではうまくできているのですが、一体どこが悪いのでしょうか?
>回答のほどよろしくお願いいたします。

自分でステップ実行なりして動作を確認しないといつまでたっても上達しません。


この投稿にコメントする

削除パスワード

No.20069

Re:永久ループ(プログラムがうまく処理されない)
投稿者---shu(2005/02/18 11:14:42)


>プログラムを実行すると永久ループします。
>私の頭の中ではうまくできているのですが、一体どこが悪いのでしょうか?
>回答のほどよろしくお願いいたします。

貴方の頭の中の考えが、間違っています。
はたまた、勘違いしているのでしょう。

無限ループになるということは、
無限ループになるようにプログラムが組まれています。

ループで継続条件など間違っているはず。
と、特にソースを解読することなく思いました。


この投稿にコメントする

削除パスワード

No.20070

Re:永久ループ(プログラムがうまく処理されない)
投稿者---επιστημη(2005/02/18 11:33:20)


>プログラムを実行すると永久ループします。

どこで永久ループにはまっていますか?

>私の頭の中ではうまくできているのですが、一体どこが悪いのでしょうか?

思った通りに作っていないのでしょう。



この投稿にコメントする

削除パスワード

No.20073

Re:ヘッダーレコードがきちんと書きこまれないのは何故?
投稿者---Q(2005/02/18 15:38:10)


確かに自分で考えて、実行して調べるべきですね。申し訳ございません。
追求すると原因となる部分を見つけることができました。
原因ははじめのヘッダーレコードの書き込みがうまくいきません。
バイナリエディタで調べても「H」が書き込まれていません。
処理はきちんと行っているはずなのですが何故でしょうか?
ちなみに下記の部分だけで実行した場合、きちんと表示されました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* ノード(レコード)の定義 */  
typedef struct head{
    char    id;     /* 'H' */
    int     ninzu;        /* レコード件数 */
    double  goukei[3];         /* 科目別合計点数 */
}HEAD;
typedef struct body{
    char        id;    /* 'B' */
    char       kumi[5];      /* クラス */
    long int    bango;   /* 学籍番号(入学年(西暦)+連番(1-999)) */
    char       namae[20];  /* 名前 */
    short int   ten[3];         /* 科目別点数 */
}BODY;
typedef struct foot{
    char    id;     /* 'E' */
}FOOT;
typedef union record{
    struct head h_data;      /* ヘッダー */
    struct body b_data;      /* 明細データ */
    struct foot f_data;      /* フッター */
}RECORD;

FILE *fp;                  /* ファイルポインタ の宣言(グローバル宣言) */

void file_header_update(BODY);
void file_data_write(BODY);
void file_display(void);

void main(int argc, char **argv)
{

    BODY    data;
    RECORD  rec;
    int  i;
    
    if (argc != 2){
        printf("コマンドライン引数に誤りがあります。\n");
        printf("Usage:EXEname filename\n");
        exit(EXIT_FAILURE);
    }
    
    /* ファイルオープン */
    if ( (fp = fopen(argv[1],"r+b")) == NULL){
        /*ファイルが存在しない場合は作成する*/
        fp = fopen(argv[1],"w+b");
        /*ヘッダーレコード作成*/
        rec.h_data.id = 'H';
        rec.h_data.ninzu = 0;
        rec.h_data.goukei[0] = 0;
        rec.h_data.goukei[1] = 0;
        rec.h_data.goukei[2] = 0;
        /*ヘッダーレコード書込*/
        fseek(fp,0,SEEK_SET);
        fwrite(&rec.h_data,sizeof(RECORD),1,fp);
    }
}





この投稿にコメントする

削除パスワード

No.20076

Re:ヘッダーレコードがきちんと書きこまれないのは何故?
投稿者---επιστημη(2005/02/18 16:51:07)


> 処理はきちんと行っているはずなのですが何故でしょうか?

それはあなたがそう思っているだけ。推測せず、実測しましょう。

> ちなみに下記の部分だけで実行した場合、きちんと表示されました。

ならば file_header_update() に原因があると推理できるのでは?




この投稿にコメントする

削除パスワード

No.20086

Re:ヘッダーレコードがきちんと書きこまれないのは何故?
投稿者---Q児(2005/02/19 21:57:16)


>ならば file_header_update() に原因があると推理できるのでは?
mainのwhile()文の手前でexit処理をおこなってもうまくいかないのは、どうやらfclose()処理を行なわずに終了いるのが原因でした。
きちんとfclose()を行うとH(ヘッダー)が書き込まれていました。




この投稿にコメントする

削除パスワード

No.20074

Re:永久ループ(プログラムがうまく処理されない)
投稿者---kiraku(2005/02/18 15:38:34)


>プログラムを実行すると永久ループします。
>私の頭の中ではうまくできているのですが、一体どこが悪いのでしょうか?
>回答のほどよろしくお願いいたします。

手始めに while文を削除してください。
その後、“私の頭の中”を初期化すればループしなくなるはずです。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧