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


初心者  2005-11-24 21:56:30  No: 59767

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


KING・王  2005-11-24 22:10:00  No: 59768

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

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


PATIO  2005-11-25 01:37:09  No: 59769

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


ヨロシコ  2005-11-25 18:45:48  No: 59770

>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 20:25:40  No: 59771

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


YuO  2005-11-25 21:03:47  No: 59772

> 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-26 00:57:58  No: 59773

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加