構造体のコピーについて

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

構造体のコピーについて

#1

投稿記事 by humu. » 12年前

初めまして。

龍神録プログラミングの館を参考にしてゲームを作っているのですが、セーブデータの書き込みの準備段階のコードが分からず、質問させていただきました。

現在、セーブデータ構造体の一部に他の構造体をコピーし、まとめてセーブデータとして出力しようとして、

コード:

savedata.config = configpad;
savedata.hiscore[0] = ranking;
savedata.hiscore[1] = EX_ranking;
としたところ、
「二項演算子 '=' : 型 'configpad_t' の右オペランドを扱う演算子が見つかりません (または変換できません)。」というエラーが出てビルドが出来なかったので、

コード:

memcpy(savedata.config,configpad,sizeof(configpad));
memcpy(savedata.hiscore[0],ranking,sizeof(ranking));
memcpy(savedata.hiscore[1],EX_ranking,sizeof(EX_ranking));
としたところ、今度は
「'memcpy' : 1 番目の引数を 'pad_t' から 'void *' に変換できません。」というエラーでビルドが出来ません。

構造体に構造体をコピーする関数等はあるのでしょうか?

自分でも調べてみたのですがよく分からず、質問させていただきました。

ちなみに、ビルドエラーはどちらの場合もこの3行すべてについて同様のものが出ていました。

box
記事: 2002
登録日時: 15年前

Re: 構造体のコピーについて

#2

投稿記事 by box » 12年前

humu. さんが書きました:

コード:

memcpy(savedata.config,configpad,sizeof(configpad));
memcpy(savedata.hiscore[0],ranking,sizeof(ranking));
memcpy(savedata.hiscore[1],EX_ranking,sizeof(EX_ranking));
構造体の定義や、上記の第2引数(configpad, ranking, EX_ranking)の定義が
どうなっているかを見せてくださると、「実はmemcpyでできる」という展開になるかもしれません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 構造体のコピーについて

#3

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

構造体は同じ型の構造体にそのまま代入できますので、代入できないのは型が違うからだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 構造体のコピーについて

#4

投稿記事 by みけCAT » 12年前

softya(ソフト屋) さんが書きました:構造体は同じ型の構造体にそのまま代入できますので、代入できないのは型が違うからだと思います。
確かにconfigpad_tとpad_tで型が違っているようですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

humu.

Re: 構造体のコピーについて

#5

投稿記事 by humu. » 12年前

box さんが書きました: 構造体の定義や、上記の第2引数(configpad, ranking, EX_ranking)の定義が
どうなっているかを見せてくださると、「実はmemcpyでできる」という展開になるかもしれません。
こんな感じです。

コード:

//セーブデータ
typedef struct{
	bool window;//ウィンドウモードか否か
	pad_t config;//ゲームパッドのキーコンフィグ情報
	bool extra;//EXTRA解放フラグ
	int clflag[2][2];//キャラクタ・装備毎のクリアフラグ
	ranking_t hiscore[2];//ハイスコア
	long chksum;//チェックサム変数
}savedata_t;

typedef struct{
	unsigned long hiscore[10];//上位10個分のランキング
	unsigned long stage[10];//どのステージまで進んだか
}ranking_t;

コード:

GLOBAL savedata_t savedata;
GLOBAL ranking_t ranking[2][2],EX_ranking[2][2];
キーコフィグについてはみけCATさんとソフト屋さんの言うとおり、型が違っていました。
pad_tの真下で定義してるのにconfigpad_tに気づいてなかった……orz

日付が変わって冷静になってみたら全部型が違う気がするよ……。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 構造体のコピーについて

#6

投稿記事 by みけCAT » 12年前

savedata.hiscore[0]とrankingも型が違いますね。
rankingおよびEX_rankingの全てのデータを保存するには、savedataのhiscoreは要素数が足りません。
どれかを保存すればいい仕様ですか?
全て保存しないといけない場合、領域(要素数)を追加し、要素を1個ずつ代入してください。
オフトピック
今回の構造体にはポインタが含まれていないようなので、これで大丈夫だと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

humu.

Re: 構造体のコピーについて

#7

投稿記事 by humu. » 12年前

セーブデータの構造体を

コード:

typedef struct{
	bool window;//ウィンドウモードか否か
	configpad_t config;//ゲームパッドのキーコンフィグ情報
	bool extra;//EXTRA解放フラグ
	int clflag[2][2];//キャラクタ・装備毎のクリアフラグ
	ranking_t hiscore[2][2][2];//ハイスコア
	long chksum;//チェックサム変数
}savedata_t;
に書き換え、代入部分を

コード:

savedata.config = configpad;
memcpy(savedata.hiscore[0],ranking,sizeof(ranking));
memcpy(savedata.hiscore[1],EX_ranking,sizeof(EX_ranking));
とした所、問題なくビルド出来ました。

セーブデータの読み込み部分で問題が発生していたりしますが、とりあえず書き込み部分はできたのでこれで解決とします。
読み込みについてはまた自力で解決できない場合に書込させていただきます。

ありがとうございました。

閉鎖

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