doubleのデータを表示について


初心者  2005-11-24 12:56:30  No: 59767  IP: 192.*.*.*

はじめましてです。
MFCを使っています。
突然ですが
struct DED{
  double test1;
  double test2;
  double test3;
};
この構造体に値をいれて、ファイルに書き込むんですが
test1にデータがはいらないで書き込んだ場合、「""」と書きたいのですが
構造体の初期化ができません。はじめから初期値をもっていたいのですが、
0をいれておいても、0は書き込みたいのです。
ご教授お願いいたします

編集 削除
KING・王  2005-11-24 13:10:00  No: 59768  IP: 192.*.*.*

> 構造体の初期化ができません。
DED obj = {0.0, 0.0, 0.0};
でできませんか?

> 0をいれておいても、0は書き込みたいのです。
0を書き込みたいのなら、そのまま値を書けば問題ないと思います。
“0を書き込みたくない”の書き間違えなら、書き込み処理の部分で、
値チェックを行い、書き込むか、書き込まないか判断し、
それぞれの処理を行なえばOKだと思います。

編集 削除
PATIO  2005-11-24 16:37:09  No: 59769  IP: 192.*.*.*

C++のdoubleにNaN(Not-a-Number)は無かったと思うんですが、どうでしたっけ?
データを確かに入れたかどうかまで管理したくて、かつ無効値の設定も出来ないなら、
データ変数一つ一つに対応する有効/無効フラグでも作るしかないのでは?
例えばですが、フラグ用に1バイトの変数を用意しておいて初期段階では
オールビット0にしておき、変数にデータを設定するタイミングで対応する
ビットを1にします。
書き込み時にこのビットフラグを見て有効データなら書き込むようにすれば
出来そうです。
単純に各項目に対応するフラグを変数でもつとか、BOOLの配列で持つとか
やり方はいくらでもありそうです。

編集 削除
ヨロシコ  2005-11-25 09:45:48  No: 59770  IP: 192.*.*.*

>DED obj = {0.0, 0.0, 0.0};
では、宣言するたびに初期化を行わなければならないので
-----------------------
struct DED{
   DED(){
     test1 = 1.0e+100;
     test1 = 1.0e+100;
     test1 = 1.0e+100;
   }
   double test1;
   double test2;
   double test3;
};
---------------------------
とすればオブジェクトが生成されたときに初期値が入っています。
1.0e+100というのはdoubleの最大値。(間違っていたらごめんなさい...)
これ以上の値は入ることはありません。初期値にこれをいれておき、
取り込んだときに1.0e+100が入っていれば、空欄にすればよいでしょう。
---------------------------------------
char  cStr[56];
if( obj.test1 == 1.0e+100 ){
   strcpy( cStr, "" );
} else {
   sprintf( cStr, "%lf", obj.test1 );
}
----------------------------------------
答えすぎですかね...。

編集 削除
Toshi  2005-11-25 11:25:40  No: 59771  IP: 192.*.*.*

>   DED(){
>     test1 = 1.0e+100;
>     test1 = 1.0e+100;
>     test1 = 1.0e+100;
   }
 test1 に3回値を入れてる・・・
と突っ込んで見たりして・・・
(冗談。きっとみんな汲んでます。)

編集 削除
YuO  2005-11-25 12:03:47  No: 59772  IP: 192.*.*.*

> C++のdoubleにNaN(Not-a-Number)は無かったと思うんですが、どうでしたっけ?

C++という範囲では実装に依存してしまいますが,
# see) std::numeric_limits::has_quiet_NaN, std::numeric_limits::has_signaling_NaN
Visual C++という範囲で見ると,NaNは存在します。
MSDN : Not a Number (NAN) Items
http://winfx.msdn.microsoft.com/library/en-us/dv_vclang/html/60e7d88f-ea87-4460-ae54-a22b43d77cd7.asp
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1041/vclang/html/vclrfNotNumberNANItems.htm


> 1.0e+100というのはdoubleの最大値。(間違っていたらごめんなさい...)

違いますね。
<float.h>のDBL_MAXまたは,<limits>のstd::numeric_limits<double>::max()が最大値で,
VC++.NET 2003の場合,1.7976931348623158e+308になります。

編集 削除
PATIO  2005-11-25 15:57:58  No: 59773  IP: 192.*.*.*

>Visual C++という範囲で見ると,NaNは存在します。
VC6のHELPを引いても出てこなかった。(T-T)

2005年10月のMSDNには入っているみたいです。

編集 削除