掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7769

このようなやり方は正確な結果を保証できるのでしょうか
投稿者---古い初心者(2007/08/01 15:00:28)


いつもいつもお世話になっております。
今度はデータの保存と再ロードに関するご質問させていただきます。

例えば、下記のようなデータをファイルに保存しようとします。

struct myST {
char c;
double d;
int i;
float f;
}

myST stx1;
myST stx2;

stx1の諸メンバーに具体数値を設定してから、ファイルに書き込みます。

fwrite(&stx1, sizeof(myST), 1, stream); // stream は"wb"でopen済み
fclose(stream);

それから、下記のようにファイルの中身をstx2に読み込みます。

fread(&stx2, sizeof(myST), 1, FILE *stream);// stream は"rb"でopen済み

そうすると、stx2 は必ずstx1の内容とまったく同じになるのでしょうか。

【※ 何が気になっているというと、
システムのメモリのアラインメント関係で、またはコンパイラーやリンクの設定等によって
上記のようなやり方で正確な結果が保証されないということです。
------余計な心配かな?】

ご指導お願い致します



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:このようなやり方は正確な結果を保証できるのでしょうか 7770 YuO 2007/08/01 15:40:12


No.7770

Re:このようなやり方は正確な結果を保証できるのでしょうか
投稿者---YuO(2007/08/01 15:40:12)


>例えば、下記のようなデータをファイルに保存しようとします。
>stx1の諸メンバーに具体数値を設定してから、ファイルに書き込みます。
>それから、下記のようにファイルの中身をstx2に読み込みます。
>そうすると、stx2 は必ずstx1の内容とまったく同じになるのでしょうか。

同一の環境かつ実装でさらに同一の設定であれば,問題ないでしょう。
それ以外の場合は,状況次第としか書きようがありません。


>【※ 何が気になっているというと、
>システムのメモリのアラインメント関係で、またはコンパイラーやリンクの設定等によって
>上記のようなやり方で正確な結果が保証されないということです。
>------余計な心配かな?】

移植性という観点から見ると,「保証は一切無い」が正しいです。
一番わかりやすいところから書くと,エンディアンの問題があります。
さらに,各型のサイズ (charでさえビット数は異なるかもしれない),浮動小数点数の内部の扱い方の問題など,alignment以外にも問題はあります。



この投稿にコメントする

削除パスワード

No.7777

Re:このようなやり方は正確な結果を保証できるのでしょうか
投稿者---古い初心者(2007/08/02 09:53:17)


YuO様
いつもお世話になっております。
ご教授ほんとうに有難う御座います。

>移植性という観点から見ると,「保証は一切無い」が正しいです。
そうですか。
例えば、データの保存formatは同じIEEE規準している言語同士で、
同じOS上で、メモリのアラインメントを禁止する条件でコンパイルしてもだめでしょうか。

またお願い致します。






この投稿にコメントする

削除パスワード

No.7778

Re:このようなやり方は正確な結果を保証できるのでしょうか
投稿者---επιστημη(2007/08/02 10:17:30)
http://blogs.wankuma.com/episteme/


>例えば、データの保存formatは同じIEEE規準している言語同士で、
>同じOS上で、メモリのアラインメントを禁止する条件でコンパイルしてもだめでしょうか。

2つの環境でコンパイル/実行し、まったく同一のバイト列ができあがるんならOK.

ポータビリティを気にするんなら、XMLかなにかでやり取りするのが無難じゃないでしょか。



この投稿にコメントする

削除パスワード

No.7779

Re:このようなやり方は正確な結果を保証できるのでしょうか
投稿者---たかぎ(2007/08/02 16:33:36)
http://www.kijineko.co.jp/


>例えば、データの保存formatは同じIEEE規準している言語同士で、
>同じOS上で、メモリのアラインメントを禁止する条件でコンパイルしてもだめでしょうか。

たぶん大丈夫ですが、保証があるかどうかは別問題です。
保証するとすれば、あなたがユーザーに対して行う必要があります。


この投稿にコメントする

削除パスワード

No.7780

Re:このようなやり方は正確な結果を保証できるのでしょうか
投稿者---Ban(2007/08/03 01:25:30)


>>移植性という観点から見ると,「保証は一切無い」が正しいです。
>そうですか。

御意。

>例えば、データの保存formatは同じIEEE規準している言語同士で、
>同じOS上で、メモリのアラインメントを禁止する条件でコンパイルしてもだめでしょうか。

どれだけそんな特殊な例にぶち当たるか、ということは別にして,
突き詰めたことを書けば、保証は無理でしょう。


IEEE準拠というのはfloatの内部表現のことだとして、
OSを同じにして(例えば64bit版と32bit版のVistaは別OSだとして)、
アライメントを禁止するとして(一切パディングしないと最初の例はRISC系CPU上で落ちると思いますが…)も……

Linux/x86とLinux/MIPS(Little/Big)など同じOSでも別ハードということはあります。

また、同一OS上でもコンパイラ次第でintのサイズが違う(or変えられる)ことなどもあります。

# 後は、C++っぽいので継承とか入ってくるともっと危険(structも継承とかできます)


この投稿にコメントする

削除パスワード

No.7785

Re:このようなやり方は正確な結果を保証できるのでしょうか(お礼)
投稿者---古い初心者(2007/08/03 14:17:59)


皆様ご指導本当に有難う御座いました。

【特にBan様の文章に非常に納得しました。
聞きたいところよくつかまれて、高水準の返答に心から感謝致します】

(目的はC言語でJavaのsrializtion機能を模擬したかったのですが、やはり簡単な方法で実現できないようですね)

今度とも宜しくお願い申し上げます。





この投稿にコメントする

削除パスワード

No.7789

Re:このようなやり方は正確な結果を保証できるのでしょうか(お礼)
投稿者---Ban(2007/08/04 01:22:43)


>(目的はC言語でJavaのsrializtion機能を模擬したかったのですが、やはり簡単な方法で実現できないようですね)

(Cでなく)C++でいいなら、boost::serializationをお勧めしておきます。(http://boost.org)
私自身Javaも書きますが、C++におけるシリアライザとして遜色ないと思ってます。

Boostというのは、次期C++仕様策定メンバなどがフリーで提供している、
C++を活用するためには事実上必須な、デファクトスタンダードなライブラリです。
# 私見ですが、templateとboostのないC++は唯のbetter Cにすぎないと思ってます。
# それでも、C言語に比べれば格段にマシだとも思ってますが…。

外部制約でboostが使えないなら、MFCのCArchiveという次善策もあるかと思いますが、
MFCの時点でVC限定(BCCとかもなくはないですが…)ですね。


この投稿にコメントする

削除パスワード

No.7790

お礼
投稿者---古い初心者(2007/08/06 10:15:06)


Ban様
丁寧な教授ほんとうに有難う御座います。
>(Cでなく)C++でいいなら、boost::serializationをお勧めしておきます。
そうですか、知りませんでした。いずれ利用してみたいのです。
情報のご提供に感謝します。
ただ、MFCに関して10年前少し経験があってそれ以降ずーと敬遠しています。

(余談ですが、個人的にはJavaがオペランドの定義ができる時点で、再びJavaに戻りたいのです。)

あらためてお礼を申し上げます。






この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ