char型 と CString型の数字を比較したい – 固定ページ 2 – プログラミング – Home

char型 と CString型の数字...
 
通知
すべてクリア

[解決済] char型 と CString型の数字を比較したい

固定ページ 2 / 3

PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

多分、επιστημηのBCDが正解では?

入っている値を16進数でみれば、その日付の形になるんじゃないかなぁ。
だから、

Info.year = 0x07;
Info.month = 0x09;
Info.day = 0x06;
が正解なんじゃないかな。
これなら1バイトでも12月とか表現できますからね。
BCDの場合、16進文字列に変換して数値化しないと目的の値は得られないでしょう。
それに、char1バイトの変数をatoiに渡しちゃ駄目でしょ。
atoiは、NULL終端の文字列じゃないと暴走してしまう。
char1バイトの変数という時点でそのままatoiに渡すと言う選択肢は無しです。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

なんにせよ、質問している本人がデータの中身をわかっていないのでは
質問自体が成立しないです。仕様書なり、作者本人に聞くなり、
そのモジュールを管理しているところに問合せるなりして情報を集める事からしないと。

あと、char1バイトの変数をそのままatoiに渡している事からして
C言語の文法とか知識が怪しいのではと言う気もします。
この辺もちゃんと勉強された方がよろしいかと思います。


返信引用
shang
 shang
(@shang)
ゲスト
結合: 17年前
投稿: 23
Topic starter  

回答ありがとうございます。いろいろアドバイスを参考にし
dwTemp = Info.year * 10000;
dwTemp += Info.month * 100;
dwTemp += Info.day;
dwTemp2 = atoi((const char*)CString);
if (dwTemp > dwTemp2){
}
と直しました。
dwTempには目的の値(70906)が入るようになったのですが,
今度はdwTemp2に全然関係のない値(2147...)が入っています。

今CString型の変数を整数にする方法を調べています。
このやり方であっているのでしょうか・・


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

VS2005ですよね?

>dwTemp2 = atoi((const char*)CString);
の(const char*)をはずすと、エラーが出るということであれば、
atoiを使うところで間違っています。

_ttoi

あたりを使って数値に変換してください。
(CStringからconst char*の値が取れるのは「マルチバイト文字セット」を使ったときの
み。VS2005だとデフォルトが「UNICODE文字セット」なので。)


返信引用
shang
 shang
(@shang)
ゲスト
結合: 17年前
投稿: 23
Topic starter  

お恥ずかしい話ですがC言語は研修でやった程度で完全に理解出来ているとは言い難いで
す。。
今勉強しながら見よう見まねでやっている所ですので変な質問になっていると思います
がすいません。。
同じ数字を表現するのにもいろいろあるんですね。勉強になります。

今やっているのはちょっと時間に追われていまして、、駄目だとは分かっていてもそん
なに調べることなく試行錯誤で作成している所です。。
出来れば自分のコードが何で駄目なのかも教えてもらえると助かります。。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> dwTemp2 = atoi((const char*)CString);

なんだそりゃ?
CString x;
dwTmp2 = atoi((const char*)x);
ならともかくも。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> この構造体を宣言している部分、値をセットしている部分は他の人が作成したもので
して。。

んじゃそのヒトに尋ねなわからんやん。
「10月だと0x0aですか0x10ですか?」
「10日だと0x0aですか0x10ですか?」
を確認しておかないと今週明けと来月にヒドイ目に遭うよ。


返信引用
shang
 shang
(@shang)
ゲスト
結合: 17年前
投稿: 23
Topic starter  

書き忘れていました、環境はVS2005です。

dwTemp2 = atoi((const char*)CString);
の部分を
dwTemp2 = _ttoi((const char*)CString);
にしても
dwTemp2 = _ttoi(CString);
にしてもエラーは出ませんが値は以前と同じおかしな値です。。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

επιστημη さんの指摘がありましたが、

>CString型の値
>csStr = 070906と比較しようとしています。
だったら

dwTemp2 = _ttoi(csStr);

です。クラス名を指定してうまくいくわけないですね。


返信引用
shang
 shang
(@shang)
ゲスト
結合: 17年前
投稿: 23
Topic starter  

CStringの部分はεπιστημη さんのおっしゃる通りです。
他で定義されている値ですので、変数名からは分からないと思い便宜上変えて書きまし
た。。
10月の場合は 0x10となっています。
わけあってデータ作成者とは連絡が取れません、、データから想像するしかない状況な
のです。。すいません。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 他で定義されている値ですので、変数名からは分からないと思い便宜上変えて書きま
した。。

俺流に表現されると余計にわかんなくなります。
Info.year = 7 って書いて怒られたばっかでしょ?

> 10月の場合は 0x10となっています。

あちゃー、やっぱBCDぢゃん >_<
(x >> 4)*10 + x&0x0f;
ってやんなきゃー


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> (x >> 4)*10 + x&0x0f;
> ってやんなきゃー

おっと、符号を考えると

x/16*10 + x%16
が正解かしら?


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>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);


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

...なんかもーぐだぐだ。
なけなしの推論をことごとく覆されてもっすご疲れる orz
質問の仕方/状況報告の仕方 を学んだ方がよろしいよ。


返信引用
shang
 shang
(@shang)
ゲスト
結合: 17年前
投稿: 23
Topic starter  

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にしても同じになっている状況です。


返信引用
固定ページ 2 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました