構造体の初期化が出来ません。(誤って解決を押してしまいました)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
きずなん

構造体の初期化が出来ません。(誤って解決を押してしまいました)

#1

投稿記事 by きずなん » 11年前

すいません、解決してないのに解決を押してしまいました。
重複となってしまい申し訳ありません。よろしければ前のトピックを削除しといていただくと嬉しいです。
お手数かけてすいません。

以下、「構造体の初期化が出来ません。」の最後の投稿の引用です。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

皆さまご回答ありがとうございます。

typedef宣言で定義が楽になるのは理解できるんです。
typedef宣言と構造体structは相性が良いですよね。

ですが、まだ
typedef struct a{ ~~~ }b;
b hoge;
と書く場合と、
typedef struct { ~~~ }b;
b hoge;
と書く場合の違いというか、前者を書く理由がいまひとつ分かりません。
どっちの例でも2行目は「struct」を省けるので楽になりますよね?
加えてどっちの例でも同じ構造を持った変数hogeが定義されてますよね。
両者のhogeの内容に違いはありませんよね?
わざわざ前者を使う例ってなんなのでしょうか。私には、前者はむしろややこしくしている感じがします。

この答えが、以下のコードについて

コード:

    typedef struct cs{
    int a;
    }CS;
soft屋様のご返答してくださった
>それだとstruct csという形名とCSと言う形名を持つことになりますが、変数の実体は定義されません。
だと思うんですけど、
「struct cs」という型名とはどういうことでしょうか?
csもCSもstruct宣言と同義になったというわけではないんでしょうか?
cs hoge;
CS hoge;
と書いた場合、何が違うのでしょう?

しつこくて申し訳ありません。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 構造体の初期化が出来ません。(誤って解決を押してしまいました)

#2

投稿記事 by beatle » 11年前

cs は構造体タグ名
struct cs は型名
CS も型名(typedef名)

という違いがあります。
csだけでは型名ではないのです。C言語だと。

きずなん

Re: 構造体の初期化が出来ません。(誤って解決を押してしまいました)

#3

投稿記事 by きずなん » 11年前

ということは、C言語に限れば、
struct cs hoge;
と宣言することと完全に同義なのが
CS hoge;
ということになるってことでしょうか?

また、タグ名をつけるメリットってなんなのでしょうか。
単純にある変数がどの構造体だったか覚えやすくするためでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 構造体の初期化が出来ません。(誤って解決を押してしまいました)

#4

投稿記事 by softya(ソフト屋) » 11年前

申し訳ないですが、フォーラムルールですので削除はできません。
理由は他の人の参考になりうる情報を残すことが、この掲示板の目的の一つでもあるからです。

さて、ご質問の件ですが
typedef struct cs{
int a;
}CS;
と書かれた場合で
cs hoge;
と書けるのはC++の場合だけで、C言語だとエラーになります。

あと
xxx.h
typedef struct cs *PCS;
xxx.c
struct cs {
int a;
};
と言った構造体の内部構造を公開しないが、引数や戻り値でポインタとして扱って外部公開するというテクニックもあります。
きずなん さんが書きました:ということは、C言語に限れば、
struct cs hoge;
と宣言することと完全に同義なのが
CS hoge;
ということになるってことでしょうか?
そうです。
きずなん さんが書きました: また、タグ名をつけるメリットってなんなのでしょうか。
単純にある変数がどの構造体だったか覚えやすくするためでしょうか?
上に書いたような場合です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 構造体の初期化が出来ません。(誤って解決を押してしまいました)

#5

投稿記事 by h2so5 » 11年前

きずなん さんが書きました: また、タグ名をつけるメリットってなんなのでしょうか。
単純にある変数がどの構造体だったか覚えやすくするためでしょうか?
構造体のメンバに自分自身のポインタを持つ場合はタグ名が必要になります。

コード:

typedef struct cs {
    struct cs *ptr;
} CS;

きずなん

Re: 構造体の初期化が出来ません。(誤って解決を押してしまいました)

#6

投稿記事 by きずなん » 11年前

本来は1つのトピックであるべきなのに申し訳ありませんでした。
以後気をつけます。


あ~なるほどなるほど!
そうかそうか・・・今全ての質問が一気に解決しました。
タグ名だけを付けてポインタで扱うという手法もあるのですね。
便利ですね。
自己参照型も思えばタグ名が必要ですね。

今まで曖昧にしていたものがガッチリ固まりました。とてもスッキリしました。
回答していただいた皆様、ありがとうございました!

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: 構造体の初期化が出来ません。(誤って解決を押してしまいました)

#7

投稿記事 by naohiro19 » 11年前

関数の引数に渡した構造体のポインターは
(*構造体変数名).構造体のメンバー名

構造体変数名->構造体のメンバー名
で参照できます

かずま

Re: 構造体の初期化が出来ません。(誤って解決を押してしまいました)

#8

投稿記事 by かずま » 11年前

naohiro19 さんが書きました:関数の引数に渡した構造体のポインターは
(*構造体変数名).構造体のメンバー名

構造体変数名->構造体のメンバー名
で参照できます
ひどい説明ですね。
「ポインターは、メンバー名で参照できます」と言っているのと同じです。

関数の引数かどうかは関係ありません。

コード:

ある構造体の実体があって、その構造体へのポインタがある場合、
その構造体のメンバは、
 (*構造体へのポインタ).構造体のメンバ名
か
 構造体へのポインタ->構造体のメンバ名
で参照できます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 構造体の初期化が出来ません。(誤って解決を押してしまいました)

#9

投稿記事 by softya(ソフト屋) » 11年前

かずまさん。
naohiro19さんの内容は言葉足らずかもしれませんが、けっして完全な間違いではないのでフォーローする形でお願いします。
荒れるもとになりますのでよろしくお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る