ページ 1 / 1
char型配列にint型のデータを書き込む
Posted: 2010年8月12日(木) 15:50
by みけCAT
C言語でゲームを作って見ようと思い、Dev-Cpp4.9.9.2でプログラムを書いています。
ランキングを実装しようと思い、一つのchar型配列でデータを管理しようと思いました。
配列の宣言は
char ranking[14*5];
です。
この配列を初期化しようと思い、
FillMemory(ranking,sizeof(ranking),0)
*((int*)(ranking+10))=100000;/*エラーが出る行*/
*((int*)(ranking+24))=100000;
*((int*)(ranking+38))=100000;
*((int*)(ranking+52))=100000;
*((int*)(ranking+66))=100000;
のように書いたら、
invalid operands to binary *
というエラーメッセージが出ました。
どうすればchar型配列でint型のデータも扱えるか教えてくださるとありがたいです。
この配列をそのままファイルに保存するので、
すいませんが構造体を使えばいいというのはなしでお願いします、
Re:char型配列にint型のデータを書き込む
Posted: 2010年8月12日(木) 16:07
by めるぽん
構造体を使いましょう。
そのエラーが何であるかは分かりませんが、そもそも char 配列に int データを書き込む場合はアライメントの問題が発生する可能性が高いです。
この場合、int のデータを書き込みたいのであれば、そのデータを char に分割して書き込むか、int が配置可能な位置であるというのを何らかの方法で調べた上でデータを書き込むべきです。
そういうわけで、char 配列に int を書き込むのはそれなりに手間なので、
struct ranking_data
{
char c[10]; // 何かのデータ?
int value;
};
ranking_data ranking[5];
FillMemory(ranking, sizeof(ranking), 0)
ranking[0].value = 100000;
ranking[1].value = 100000;
ranking[2].value = 100000;
ranking[3].value = 100000;
ranking[4].value = 100000;
// 何かに保存する
save((char*)ranking, sizeof(ranking));
とかやるのがいいのではないでしょうか。
構造体をそのままファイルに保存すればいいだけなので、わざわざ char 配列を使う必要はありません。
Re:char型配列にint型のデータを書き込む
Posted: 2010年8月12日(木) 16:15
by パコネコ
使えそうなの探してみましたが…
sprintfというものは使えないのでしょうか?
勘違いならすいません。
Re:char型配列にint型のデータを書き込む
Posted: 2010年8月12日(木) 16:29
by toyo
構造体にすればと思ったら最後にお願いが・・・
同じ構造体でファイルの読み書きする分にはパディングに関しても問題ないと思いますが
パディングがいやならパディングなしで構造体を定義すればいいです
gccなら__attribute__ ((packed))でしたっけ
Re:char型配列にint型のデータを書き込む
Posted: 2010年8月12日(木) 17:01
by みけCAT
構造体を使う方法でうまくいきました。
/*宣言*/
struct ranking_data
{
char name[10];
int kyori;
};
/*ランキングデータ読み込み*/
wsprintf(stagefile,"%s\\ranking.dat",folder);
hfile=CreateFile(stagefile,GENERIC_READ,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(hfile==INVALID_HANDLE_VALUE) {
/*ランキングデータ初期化*/
FillMemory(ranking,sizeof(ranking),0);
ranking[0].kyori=100000;
ranking[1].kyori=100000;
ranking[2].kyori=100000;
ranking[3].kyori=100000;
ranking[4].kyori=100000;
status=9;
} else {
/*ランキングデータ読み込み*/
ReadFile(hfile,ranking,sizeof(ranking),(DWORD*)&readsize,NULL);
if(readsize!=sizeof(ranking))status=-3; else status=9;
CloseHandle(hfile);
}
/*自分が何位にランクインしたか*/
for(rank=0;rank<5;rank++) {
if(ranking[rank].kyori>=kyori)break;
}
if(rank<5) {
memcpy(&ranking[rank+1],&ranking[rank],sizeof(ranking[0])*(4-rank));
FillMemory(&ranking[rank],sizeof(ranking[rank]),0);
ranking[rank].kyori=kyori;
ranklast=37;
}
/*ランキングの保存*/
wsprintf(stagefile,"%s\\ranking.dat",folder);
hfile=CreateFile(stagefile,GENERIC_WRITE,0,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
if(hfile==INVALID_HANDLE_VALUE) {
status=-4;
} else {
/*ランキングデータ書き込み*/
WriteFile(hfile,ranking,sizeof(ranking),(DWORD*)&readsize,NULL);
if(readsize!=sizeof(ranking))status=-5; else status=12;
CloseHandle(hfile);
}
Re:char型配列にint型のデータを書き込む
Posted: 2010年8月13日(金) 03:35
by たかぎ
> invalid operands to binary *
>
> というエラーメッセージが出ました。
エラーの直接の原因は、FillMemoryの行の末尾にセミコロンがないからです。
MinGWなので、(移植性を除けば)境界調整の問題もおきないと思いますので、それで何とかなるのでは?