はじめましてです。
MFCを使っています。
突然ですが
struct DED{
double test1;
double test2;
double test3;
};
この構造体に値をいれて、ファイルに書き込むんですが
test1にデータがはいらないで書き込んだ場合、「""」と書きたいのですが
構造体の初期化ができません。はじめから初期値をもっていたいのですが、
0をいれておいても、0は書き込みたいのです。
ご教授お願いいたします
> 構造体の初期化ができません。
DED obj = {0.0, 0.0, 0.0};
でできませんか?
> 0をいれておいても、0は書き込みたいのです。
0を書き込みたいのなら、そのまま値を書けば問題ないと思います。
“0を書き込みたくない”の書き間違えなら、書き込み処理の部分で、
値チェックを行い、書き込むか、書き込まないか判断し、
それぞれの処理を行なえばOKだと思います。
C++のdoubleにNaN(Not-a-Number)は無かったと思うんですが、どうでしたっけ?
データを確かに入れたかどうかまで管理したくて、かつ無効値の設定も出来ないなら、
データ変数一つ一つに対応する有効/無効フラグでも作るしかないのでは?
例えばですが、フラグ用に1バイトの変数を用意しておいて初期段階では
オールビット0にしておき、変数にデータを設定するタイミングで対応する
ビットを1にします。
書き込み時にこのビットフラグを見て有効データなら書き込むようにすれば
出来そうです。
単純に各項目に対応するフラグを変数でもつとか、BOOLの配列で持つとか
やり方はいくらでもありそうです。
>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 );
}
----------------------------------------
答えすぎですかね...。
> DED(){
> test1 = 1.0e+100;
> test1 = 1.0e+100;
> test1 = 1.0e+100;
}
test1 に3回値を入れてる・・・
と突っ込んで見たりして・・・
(冗談。きっとみんな汲んでます。)
> 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になります。
>Visual C++という範囲で見ると,NaNは存在します。
VC6のHELPを引いても出てこなかった。(T-T)
2005年10月のMSDNには入っているみたいです。
ツイート | ![]() |