char型配列にint型のデータを書き込む

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

char型配列にint型のデータを書き込む

#1

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

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型のデータを書き込む

#2

投稿記事 by めるぽん » 15年前

構造体を使いましょう。

そのエラーが何であるかは分かりませんが、そもそも 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型のデータを書き込む

#3

投稿記事 by パコネコ » 15年前

使えそうなの探してみましたが…
sprintfというものは使えないのでしょうか?
勘違いならすいません。

toyo

Re:char型配列にint型のデータを書き込む

#4

投稿記事 by toyo » 15年前

構造体にすればと思ったら最後にお願いが・・・
同じ構造体でファイルの読み書きする分にはパディングに関しても問題ないと思いますが
パディングがいやならパディングなしで構造体を定義すればいいです
gccなら__attribute__ ((packed))でしたっけ

みけCAT

Re:char型配列にint型のデータを書き込む

#5

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

構造体を使う方法でうまくいきました。
/*宣言*/
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型のデータを書き込む

#6

投稿記事 by たかぎ » 15年前

> invalid operands to binary *
>
> というエラーメッセージが出ました。

エラーの直接の原因は、FillMemoryの行の末尾にセミコロンがないからです。
MinGWなので、(移植性を除けば)境界調整の問題もおきないと思いますので、それで何とかなるのでは?

閉鎖

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