掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

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

No.24722

typedefと構造体
投稿者---あきき(2005/12/11 23:36:17)


typedefをきちんとマスターしているか当サイトを問題を借り解いたところ、何が原因か調べてますが、皆さんの助言を頂きたく投稿しました
コンパイルもまだ通っていない状態です。
【問1】
次に示す社員情報を構造体として作成し、内容を表示して確認せよ。

尚、データ表示は個数ではなく汎用性を考えて、社員番号「0」まで繰返して行うこと。

社員番号 氏名 役職 勤続年数 基本給 
78027 "神保直樹" "課長" 21 346780 
84004 "相原彰子" "主任" 15 223640 
87022 "本郷幸子" "" 12 208760 
93042 "三上葵" "" 6 176530 
95005 "佐々木翠" "" 4 166700 
99009 "長崎宏美" "" 1 150140 
0     ""         "" 0 0 
*/
#include <stdio.h>

typedef struct syain_dat {
        long  no;         //社員番号
        char  *name;        //氏名
        char  *yaku;        //役職
        int   nensu;        //勤続年数
        long  kihon;        //基本給
}rec_t;

int  main( void )
{
    //変数の宣言
    rec_t rec[20];

    rec[20]={//注1
        { 78027, "神保直樹", "課長", 21, 346780},
        { 84004, "相原彰子", "主任", 15, 223640},
        { 87022, "本郷幸子", "", 12, 208760},
        { 93042, "三上葵", "", 6, 176530},
        { 95005, "佐々木翠", "", 4, 166700},
        { 99009, "長崎宏美", "", 1, 150140},
        { 0, "","", 0, 0}
    };
    int  i;//注2

    //タイトルの表示
    printf("社員番号  氏 名  役 職   勤続年数    基本給\n");

    for( i=0; rec[i].no != 0; i++){//注2関連
        printf("%5ld   %-12s  %5s  %d %6lf\n",
            rec[i].no,rec[i].name,rec[i].yaku,rec[i].nensu,rec[i].kihon);
    }

    return 0;
}


コンパイルエラー内容は以下の通りです
\struct01.c(31) : error C2059: 構文エラー : '{'
\struct01.c(40) : error C2143: 構文エラー : ';' が '型' の前にありません。
\struct01.c(45) : error C2065: 'i' : 定義されていない識別子です。
なお、使用コンパイラーは、VC++です。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:typedefと構造体 24724 まきじ 2005/12/11 23:41:59
<子記事> Re:typedefと構造体 24726 nop 2005/12/11 23:55:39
<子記事> Re:typedefと構造体 24728 RAPT 2005/12/11 23:59:21


No.24724

Re:typedefと構造体
投稿者---まきじ(2005/12/11 23:41:59)


>rec[20]={・・・}
>int i;

i の宣言がブロックの先頭でない。
C99 なら問題ないけど。


この投稿にコメントする

削除パスワード

No.24725

Re:typedefと構造体
投稿者---あきき(2005/12/11 23:54:07)


>>rec[20]={・・・}
>>int i;
>
>i の宣言がブロックの先頭でない。
>C99 なら問題ないけど。

ブロックの先頭で、'i'を宣言しましたが、やはり「注1」でエラーになりました。


この投稿にコメントする

削除パスワード

No.24739

Re:typedefと構造体
投稿者---あきき(2005/12/12 15:03:17)


>i の宣言がブロックの先頭でない。
>C99 なら問題ないけど。

C99以降で宣言の順番が定められているのですか


この投稿にコメントする

削除パスワード

No.24726

Re:typedefと構造体
投稿者---nop(2005/12/11 23:55:39)


> rec_t rec[20];
> rec[20]={ (以下略)

初期化は宣言時のみ有効です。
typedef しても、構造体は構造体です。
typedef は、単に別名を定義するだけに過ぎません。


この投稿にコメントする

削除パスワード

No.24728

Re:typedefと構造体
投稿者---RAPT(2005/12/11 23:59:21)


rec_t rec[20]; rec[20]={//注1 { 78027, "神保直樹", "課長", 21, 346780}, { 84004, "相原彰子", "主任", 15, 223640}, { 87022, "本郷幸子", "", 12, 208760}, { 93042, "三上葵", "", 6, 176530}, { 95005, "佐々木翠", "", 4, 166700}, { 99009, "長崎宏美", "", 1, 150140}, { 0, "","", 0, 0} };
これはコンパイルエラー+アクセス違反になります。 こういった場合は、配列の宣言同時初期化が一番楽です。 rec_t rec[20]={ { 78027, "神保直樹", "課長", 21, 346780}, { 84004, "相原彰子", "主任", 15, 223640}, { 87022, "本郷幸子", "", 12, 208760}, { 93042, "三上葵", "", 6, 176530}, { 95005, "佐々木翠", "", 4, 166700}, { 99009, "長崎宏美", "", 1, 150140}, { 0, "","", 0, 0} };



この投稿にコメントする

削除パスワード

No.24738

Re:typedefと構造体
投稿者---あきき(2005/12/12 15:01:03)


>これはコンパイルエラー+アクセス違反になります。

文字列リテラルを思い出し、指摘されたように手直ししましたが、
Debug Error!
R6002
 -floating point not loadedの文字が表示されます
それと、
runtime errorになります。


この投稿にコメントする

削除パスワード

No.24740

Re:typedefと構造体
投稿者---iijima(2005/12/12 15:07:06)


printfの書式指定が間違っているからだと思います。


この投稿にコメントする

削除パスワード

No.24742

Re:typedefと構造体
投稿者---あきき(2005/12/12 15:24:25)


>printfの書式指定が間違っているからだと思います。
やはり、結果は同じでした。
念のためソースを貼り付けます
#include <stdio.h>

typedef struct syain_dat {
        long  no;         //社員番号
        char  *name;        //氏名
        char  *yaku;        //役職
        int   nensu;        //勤続年数
        long  kihon;        //基本給
}rec_t;

int  main( void )
{
    int  i;
    rec_t rec[20]={ //変数の宣言
        { 78027, "神保直樹", "課長", 21, 346780},
        { 84004, "相原彰子", "主任", 15, 223640},
        { 87022, "本郷幸子", "", 12, 208760},
        { 93042, "三上葵", "", 6, 176530},
        { 95005, "佐々木翠", "", 4, 166700},
        { 99009, "長崎宏美", "", 1, 150140},
        { 0, "", "", 0, 0}
    };
    //タイトルの表示
    printf("社員番号  氏 名  役 職   勤続年数    基本給\n");

    for( i=0; rec[i].no != 0; i++){
        printf("%5ld   %-12s  %5s  %6d %6lf\n",
            rec[i].no,rec[i].name,rec[i].yaku,rec[i].nensu,rec[i].kihon);
    }

    return 0;
}



この投稿にコメントする

削除パスワード

No.24743

Re:typedefと構造体
投稿者---Blue(2005/12/12 15:33:26)


>>printfの書式指定が間違っているからだと思います。
>やはり、結果は同じでした。
ドコを修正したのでしょうか?

以下のソースは、あなたの間違っていると思われる箇所をピックアップ
してみました。

#include <stdio.h>

int main( void )
{
    long int n = 10;
    printf( "%lf\n", n );
    return 0;
}



この投稿にコメントする

削除パスワード

No.24746

Re:typedefと構造体
投稿者---あきき(2005/12/12 16:06:15)


>>>printfの書式指定が間違っているからだと思います。
>>やはり、結果は同じでした。
>ドコを修正したのでしょうか?
完璧に見落としていました。long int型の書式は、%ldのはずなのに
いつの間にか、。long double型に変わっていました。
そして、コンパイルも無事通り正常終了しました



この投稿にコメントする

削除パスワード

No.24747

ありがとうございます
投稿者---あきき(2005/12/12 16:35:07)


まきじさん、nopさん、RAPTさん、iijimaさん、Blueさん解決に当たりありがとうございます。ただ、24724のレスで、C99以降では、宣言するにも、順番があるかのような表現がありましたのでそれが気がかりです。




この投稿にコメントする

削除パスワード

No.24748

Re:ありがとうございます
投稿者---Blue(2005/12/12 16:45:34)


規格書からではないですが、
7.7 変数宣言と実行コードの位置関係
を参考にしてみてください。


この投稿にコメントする

削除パスワード

No.24749

Re:ありがとうございます
投稿者---nop(2005/12/12 16:48:13)


>C99以降では、宣言するにも、順番があるかのような表現がありましたのでそれが気がかりです。

順番があるのはC99以降ではなく、C99以前です。
C99以前の規格では、
ローカル変数の宣言はブロックの先頭のみでしか行えません。


この投稿にコメントする

削除パスワード

No.24750

Re:ありがとうございます
投稿者---あきき(2005/12/12 16:55:54)


>順番があるのはC99以降ではなく、C99以前です。
>C99以前の規格では、
>ローカル変数の宣言はブロックの先頭のみでしか行えません。

初歩的な質問にお答えいただきありがとうございました。


この投稿にコメントする

削除パスワード

No.24782

Re:typedefと構造体
投稿者---shu(2005/12/13 16:37:20)


//
//  構造体とtypedefの宣言の仕方いろいろ
//

//  構造体の宣言のみ
struct shain
{
    //  省略
};


//  構造体の宣言の後、typedefで別名をつける
struct shain
{
    //  省略
};
typedef struct shain Shain;


//  構造体の宣言時に、typedefで別名をつける
typedef struct shain
{
    //  省略
} Shain;


//  構造体の宣言時に、typedefで名前をつける
typedef struct // shainを書かない
{
    //  省略
} Shain;



この投稿にコメントする

削除パスワード

No.24785

Re:typedefと構造体
投稿者---RAPT(2005/12/13 23:42:12)


ちなみに、最後の無名構造体は、C++では非推奨なので、ご注意あれ。
# コンストラクタを書きようが無いため。

typedef struct shain
{
    // snip
} shain;

ならOK。



この投稿にコメントする

削除パスワード

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