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

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

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

固定ページ 3 / 3

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

>試してみました。
>2桁の日付の場合、メッセージボックスに101027と表示されます。
ということは

>>>10月の場合は 0x10となっています。
>本当にそうですか?
そうではないということです。→ BCD ではない。

>後半部分は

>CString型の値
>csStr = 070906と比較しようとしています。
ではないの?

文字数が決まっているなら、年月日 と 時分秒 と分けてやればいいのでは?


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

> 2桁の日付の場合、メッセージボックスに101027と表示されます。

うがー! 0x10やないやんかー!


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

ぐだぐだになってすいません。
当方まだ社会人一年目でして、、お力をお貸しください。。

では前半部分は問題ないということですね。皆様ありがとうございます。

後半部分は
csStr”01010101010101”を数字に変換したいです。
先に上位6文字だけを取り出さないと駄目ということでしょうか?


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

επιστημη さん

デバッガのウォッチウィンドウに「0x10 '□'」と表示されていたので
そう書いてしまったのですが。。誤解を与えてすいません。


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

> csStr”01010101010101”を数字に変換したいです。
> 先に上位6文字だけを取り出さないと駄目ということでしょうか?

その文字列が年月日時分秒を2桁ずつ繋いだものであるなら、
なにをすれば所望の値が得られるかは自明ではないかい?
あなたが欲しいのはなにか、わかっているんでしょ?


返信引用
.
 .
(@.)
ゲスト
結合: 23年前
投稿: 37
 

>CString strTemp;
>strTemp.Format(_T(%02d%02d%02d),
> (int)Info.year, (int)Info.month, (int)Info.day);
>AfxMessageBox(strTemp);
>試してみました。
>2桁の日付の場合、メッセージボックスに101027と表示されます。

このコードで101027と表示されるのに,

>デバッガのウォッチウィンドウに「0x10 '□'」と表示されていたので
>そう書いてしまったのですが。。誤解を与えてすいません。

ウォッチウィンドウに「0x10 '□'」と表示される事はありえないと思うけど。
本当にテストした?


返信引用
麩
 麩
(@麩)
ゲスト
結合: 17年前
投稿: 95
 

ここまでこじれると冗談か何かにしか見えない…

>どうもオーバフローしている様です。
そのあたりの桁まで含めて比較する必要のある部分があるのなら、int型に変換
する方法ではうまく対処できませんから__int64等を使うか、別の比較をしないと
いけません。

比較する部分が全て年月日のみならば、επιστημηさんが言うとおり
で、自明です。

>社会人
それ以前の問題に思えてなりません。
勘違いしたまま、間違えたまま、質問をして正しい答えが得られる場というのは社
会以前にも皆無では無いでしょうか。
ましてや記号一つで意味が180度変わってしまうプログラミングに関しての質問で
す。
言葉は出来うる限り正確に扱わなければ、痛い目を見るのは自分です。
私も人の事を言えた立場じゃありませんが。

>csStr”01010101010101”を数字に変換したいです。
これも、どのような意味を持った文字列(例えば1文字目と2文字目で西暦の下
位二桁を10進数で示す、など)を、どのような意味を持った数値(西暦の下位二
桁*10000+月*100+日となる整数、等)に変換するのか、わかり難くてこじれや
すい部分かと思います。
こういった部分で自分は分かっているがこれについて質問する相手は知らない情
報、をなるべく端折らない様にした方が良いかと思います。

>デバッガのウォッチウィンドウに「0x10 '□'」
それだと値は16(10進数)って事になりますが、本当に10月などを示す状況で
0x10が表示されたのならば、それはまた別のバグという事になります。
見間違い、勘違いだったのならばとりあえず気にしなくても良いと思います。


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

誤解を与えるような書き方が多かったのは謝ります。
でも正直どこが分かっていないかも良く分かっていない状況ですので。。
でも冗談なんかじゃないでしょ。。
教えていただいたコードは全て試していますし

>ウォッチウィンドウに「0x10 '□'」と表示される事はありえないと思うけど。
本当にテストした?
もう一度見直して見たところ「10 '□'」でした。
16進表記に切り替えると「0x0a '□'」になっていました。。すいません。

今、__int64にしてやっていますがそれでもオーバーフローします。
01010101010101は、例えば07年10月23日 12時34分56秒なら
071023123456となっています。
但しこれもCString型の値をウォッチウィンドウで見ただけですので
この値の意味までは分かりません。
ただ単純にこのままの形で不等号で比較できる数字にしたかっただけです。


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

だーかーらー...
年月日が欲しいなら前半分(6文字)切り出して数値に変換すりゃえぇやないかー


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

>今、__int64にしてやっていますがそれでも
とは、関数は何を使っているのでしょうか?

_ttoiや_ttol(atoiやatol)では__int64の値は取れませんが。

_ttoi64

を使ってください。


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

解決できました。
返信がおろそかになってしまいましたが、皆様の回答に出てくる分からない単語を
調べたり、いろいろ試行錯誤していまして。。
結局以下のようにして期待していた動きになりました。
凄く勉強になりました。書いてみると簡単ですが,,,
オーバーフローもBlueさんの回答で一発解決出来ましたが、正直オーバーフローの原因

分かっても大きい値を取る関数もどうやって調べたら良いか良く分からない状態だった
もので。。

数字の扱いと型の違いなど本当に勉強になりました。
本当にありがとうございました。
一応ソースは以下のようにしました。

//リストの値を数字に変換
dwTemp1 = Info[iCount].year * 10000000000;
dwTemp1 += Info[iCount].month * 100000000;
dwTemp1 += Info[iCount].day * 1000000;
dwTemp1 += Info[iCount].hour * 10000;
dwTemp1 += Info[iCount].minute * 100;
dwTemp1 += Info[iCount].second;

//選択した値を数字に変換
dwTemp2 = _ttoi64(strGetStartTime);

//比較
if(dwTemp1 >= dwTemp2)

多分もっとスマートな書き方はあると思うのですが、今回は急ぎでしたので今後勉強し
ていきたいと思います。


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

だとすると、文字列として比較してもよかったわけね。

cosnt S_ALM_DETAILS& d = Info[iCount];
CStinrg x;
x.Format(%02d%02d%02d%02d%02d%02d,
d.year, d.month, d.day, d.hour, d.minute, d.second);
if ( x >= strGetStartTime ) { ... }


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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