ページ 11

構造体 二重定義

Posted: 2011年5月07日(土) 18:38
by KKK
プログラミングの館を見せていただいたのですがセーブの仕方を見ていたときに疑問に思いました
セーブをするときに予め構造体で変数を定義していればお手軽と書いてあったのですが
例えば

コード:

主人公構造体{
     主人公の座標
  主人公のHP
}
こんな感じで主人公構造体が定義されていた場合、

コード:

セーブしたい情報{
        主人公の座標
    主人公のHP
}
このように定義することは不可能になりますよね?・・・多分
二重定義になっちゃうんじゃないかなぁ~と思うのですがどうすればいいのでしょうか?

Re: 構造体 二重定義

Posted: 2011年5月07日(土) 18:44
by KKK
すいません、さっきの例じゃ分かりづらかったですよね

要するに主人公構造体で宣言してある変数をどうやって
セーブ情報構造体でまとめるか知りたいのです

Re: 構造体 二重定義

Posted: 2011年5月07日(土) 18:57
by box
KKK さんが書きました: 要するに主人公構造体で宣言してある変数をどうやって
セーブ情報構造体でまとめるか知りたいのです
セーブ情報構造体のメンバーとして、主人公構造体型の変数を定義すればいいのではないでしょうか。

なお、異なる構造体に同じ属性を持つメンバーを定義すること自体は、全く問題なくできます。
つまり、最初に投稿された2つの構造体を定義することは可能です。

Re: 構造体 二重定義

Posted: 2011年5月08日(日) 13:57
by KKK
そ、そうだったのですか!?
でも使う時にse-bu.xとsyujinnkou.xってなりますよね
これは全く別物の変数になってしまいますか?

Re: 構造体 二重定義

Posted: 2011年5月08日(日) 14:51
by box
KKK さんが書きました: でも使う時にse-bu.xとsyujinnkou.xってなりますよね
se-bu

syujinnkou
という、全く別々の変数が、たまたま同じ
x
というメンバーを持っているだけのことです。

コード:

struct person {
    int age;
    double height;
} taro, hanako;
てな具合に、年齢と身長をメンバーとする太郎さんと花子さんという変数を定義したとき、
2人の年齢を参照するには
taro.age
hanako.age
って書きますよね。
taroとhanakoという全く別々の変数が同じメンバーageを持っているのですから、
こういう書き方はごくごく当たり前です。

Re: 構造体 二重定義

Posted: 2011年5月08日(日) 15:15
by KKK
回答ありがとうございます
セーブ情報構造体のメンバーに主人公構造体型の変数と仰りましたが

セーブ情報構造体{
    syujinnkou.x
syujinnkou.y
}se-bu

このようにすればいいという事でしょうか?
物分りが悪くすいません

Re: 構造体 二重定義

Posted: 2011年5月08日(日) 16:43
by ISLe

コード:

//プレイヤー情報
struct player_t {
    int x, y;
    int hp;
} player;

//セーブ情報
struct savedata_t {
    struct player_t player;
} savedata[3];

// セーブ処理関数
void write_savedata(int index) {
    savedata[index].player = player; // 指定されたスロットのsavedataのメンバにコピー
    // 書き出し
}
という感じですかね。

Re: 構造体 二重定義

Posted: 2011年5月08日(日) 19:32
by KKK
何度もすみません; これを最後の質問にしますので回答してください

セーブ情報構造体にstruct player_t playerと書いてありますが
これより前に構造体の実体が宣言?されているのでstruct playerと書いちゃいけないんですか?

savedata[3]と配列があるのは分かりますが後に出てくるindexというのは
どんな意味というかどんな仕事(役割)をしているのですか?

Re: 構造体 二重定義

Posted: 2011年5月08日(日) 20:47
by box
プレイヤー情報の変数名とセーブ情報構造体のメンバー名が同じであるため、
KKKさんはやや混乱をきたしておられるようです。
両者を明確に区別したコード例を書いてみましょうか(原典:ISLeさん)。

コード:

//プレイヤー情報
struct player_t {
    int x, y;
    int hp;
} aaaaaa;

//セーブ情報
struct savedata_t {
    struct player_t bbbbbb;
} savedata[3];
 
// セーブ処理関数
void write_savedata(int index) {
    savedata[index].bbbbbb = aaaaaa; // 指定されたスロットのsavedataのメンバにコピー
    // 書き出し
}
KKK さんが書きました: これより前に構造体の実体が宣言?されているのでstruct playerと書いちゃいけないんですか?
今回の場合、プレイヤー情報構造体型の変数(あるいは構造体のメンバー名)を定義するときは、
struct player_t
の後ろに変数名やメンバー名を書かねばなりません。
struct player
という書き方はできません。
KKK さんが書きました: indexというのは
どんな意味というかどんな仕事(役割)をしているのですか?
savedata[3]と定義した配列(これはあくまで例です。KKKさんがどういうプログラムを作ろうとしているかとは別の話)の
何番目の要素にデータを放り込むか、という意味です。

Re: 構造体 二重定義

Posted: 2011年5月08日(日) 22:30
by KKK
な、なるほど・・・
構造体の中で構造体の実体をつくっていたのですね・・・
(用語はあまり知らないので分がおかしいと思いますが)
両先輩方、ありがとうございました