多分、επιστημηのBCDが正解では?
入っている値を16進数でみれば、その日付の形になるんじゃないかなぁ。
だから、
Info.year = 0x07;
Info.month = 0x09;
Info.day = 0x06;
が正解なんじゃないかな。
これなら1バイトでも12月とか表現できますからね。
BCDの場合、16進文字列に変換して数値化しないと目的の値は得られないでしょう。
それに、char1バイトの変数をatoiに渡しちゃ駄目でしょ。
atoiは、NULL終端の文字列じゃないと暴走してしまう。
char1バイトの変数という時点でそのままatoiに渡すと言う選択肢は無しです。
なんにせよ、質問している本人がデータの中身をわかっていないのでは
質問自体が成立しないです。仕様書なり、作者本人に聞くなり、
そのモジュールを管理しているところに問合せるなりして情報を集める事からしないと。
あと、char1バイトの変数をそのままatoiに渡している事からして
C言語の文法とか知識が怪しいのではと言う気もします。
この辺もちゃんと勉強された方がよろしいかと思います。
回答ありがとうございます。いろいろアドバイスを参考にし
dwTemp = Info.year * 10000;
dwTemp += Info.month * 100;
dwTemp += Info.day;
dwTemp2 = atoi((const char*)CString);
if (dwTemp > dwTemp2){
}
と直しました。
dwTempには目的の値(70906)が入るようになったのですが,
今度はdwTemp2に全然関係のない値(2147...)が入っています。
今CString型の変数を整数にする方法を調べています。
このやり方であっているのでしょうか・・
VS2005ですよね?
>dwTemp2 = atoi((const char*)CString);
の(const char*)をはずすと、エラーが出るということであれば、
atoiを使うところで間違っています。
_ttoi
あたりを使って数値に変換してください。
(CStringからconst char*の値が取れるのは「マルチバイト文字セット」を使ったときの
み。VS2005だとデフォルトが「UNICODE文字セット」なので。)
お恥ずかしい話ですがC言語は研修でやった程度で完全に理解出来ているとは言い難いで
す。。
今勉強しながら見よう見まねでやっている所ですので変な質問になっていると思います
がすいません。。
同じ数字を表現するのにもいろいろあるんですね。勉強になります。
今やっているのはちょっと時間に追われていまして、、駄目だとは分かっていてもそん
なに調べることなく試行錯誤で作成している所です。。
出来れば自分のコードが何で駄目なのかも教えてもらえると助かります。。
> dwTemp2 = atoi((const char*)CString);
なんだそりゃ?
CString x;
dwTmp2 = atoi((const char*)x);
ならともかくも。
> この構造体を宣言している部分、値をセットしている部分は他の人が作成したもので
して。。
んじゃそのヒトに尋ねなわからんやん。
「10月だと0x0aですか0x10ですか?」
「10日だと0x0aですか0x10ですか?」
を確認しておかないと今週明けと来月にヒドイ目に遭うよ。
書き忘れていました、環境はVS2005です。
dwTemp2 = atoi((const char*)CString);
の部分を
dwTemp2 = _ttoi((const char*)CString);
にしても
dwTemp2 = _ttoi(CString);
にしてもエラーは出ませんが値は以前と同じおかしな値です。。
επιστημη さんの指摘がありましたが、
>CString型の値
>csStr = 070906と比較しようとしています。
だったら
dwTemp2 = _ttoi(csStr);
です。クラス名を指定してうまくいくわけないですね。
CStringの部分はεπιστημη さんのおっしゃる通りです。
他で定義されている値ですので、変数名からは分からないと思い便宜上変えて書きまし
た。。
10月の場合は 0x10となっています。
わけあってデータ作成者とは連絡が取れません、、データから想像するしかない状況な
のです。。すいません。
> 他で定義されている値ですので、変数名からは分からないと思い便宜上変えて書きま
した。。
俺流に表現されると余計にわかんなくなります。
Info.year = 7 って書いて怒られたばっかでしょ?
> 10月の場合は 0x10となっています。
あちゃー、やっぱBCDぢゃん >_<
(x >> 4)*10 + x&0x0f;
ってやんなきゃー
> (x >> 4)*10 + x&0x0f;
> ってやんなきゃー
おっと、符号を考えると
x/16*10 + x%16
が正解かしら?
>10月の場合は 0x10となっています。
本当にそうですか?
2007/09/07(金) 10:24:51の発言をみると間違っているのか正しいのか信用できないです
けど、、、
一度10月のとき、文字列にしてどのような値か表示してみてください。
CString strTemp;
strTemp.Format(_T(%02d%02d%02d),
(int)Info.year, (int)Info.month, (int)Info.day);
AfxMessageBox(strTemp);
...なんかもーぐだぐだ。
なけなしの推論をことごとく覆されてもっすご疲れる orz
質問の仕方/状況報告の仕方 を学んだ方がよろしいよ。
CString strTemp;
strTemp.Format(_T(%02d%02d%02d),
(int)Info.year, (int)Info.month, (int)Info.day);
AfxMessageBox(strTemp);
試してみました。
2桁の日付の場合、メッセージボックスに101027と表示されます。
俺流の表現はすいませんでした。
今前半部分dwTempはうまく行くようになったと思ったのですが、
BCDだと問題ありでしょうか?
後半部分は
dwTemp2 = _ttoi(csStr);
としても目的の値が得られていない状況です。
どうもオーバフローしている様です。。
csStrは”01010101010101”の様な値で年月日時分秒をそれぞれ2桁の数字で表示してい
ます。
上記の方法ですと2147483647となり0x7fffffffです。
_ttolにしても同じになっている状況です。