人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

CString/intの変換を教えてください。

例)以下の2つの変数でお互いに変換して代入する方法を教えてください。

CString scanx;
int scann=0;



●質問者: mai_mai_mail
●カテゴリ:コンピュータ インターネット
✍キーワード:変数
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● yo-kun
●25ポイント

お互いに変換して代入の意味が良くわかりませんが

こういうことでしょうか?


// CStringからint

scann = atoi( (LPCTSTR)scanx ) ;

// intからCString

scanx.Format( "%d", scann ) ;


http://q.hatena.ne.jp/

◎質問者からの返答

ありがとうございます。

CStringからintへの変換ではおっしゃるとおりに書くと次のエラーが発生してしまいます。

error C2664: 'atoi' : 1 番目の引数を 'LPCTSTR' から 'const char *' に変換できません

intからCStringでは次のエラーが出ます。

エラー2error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : 1 番目の引数を 'const char [3]' から 'const wchar_t *' に変換できません

どのようにすればいいかわかりますでしょうか?

よろしくお願いします。


2 ● lizy
●40ポイント

CString -> intは、以下のいずれかが使えます。

scann = _ttoi(scanx); // tchar.h

scann = StrToInt(scanx); // shlwapi.h

int -> CStringはyu-kunさんの例示した、CString::Format()でできると思いますが、このメンバ関数は書式文字列としてPCXSTR型のものを受け取ることになっています。

http://msdn2.microsoft.com/ja-jp/library/18he3sk6(VS.80).aspx

PCXSTRは「CStringT オブジェクトと同じ文字型の const 文字列 (wchar_t または char のいずれか) へのポインタ」とのことですので、CStringの場合は「TCHARへのポインタ」となり、最終的にはコンパイルオプションによってwchar_t/charのいずれかになります。

http://msdn2.microsoft.com/ja-jp/library/5bzxfsea(VS.80).aspx

というわけで、ここではLPCTSTRとして書式文字列を渡せばコンパイルエラーがなくなるはずです。

scanx.Format(_T("%d"), scann); // TEXT("%d")でも可

◎質問者からの返答

lizyさん、早速回答ありがとうございました。ばっちり解決しました。もうひとつ質問があります。教えてください。

***********************************

Windows mobileでVC2005(MFC)で書いています。?のところで画面に表示させていますが、正しく計算結果の数値が表示されません。scann,hitnに適当な数値を入れると100あるいは0しか表示されません。

初歩的な質問ですが、どうかおしえてください。よろしくお願いします。


?CString scanx;int scann=0;

?CString hitx;int hitn=0;

?CString hitritux;int hitritun=0;

?hitritun=int((hitn/scann)*100);

?hitritux.Format(_T("%d"), hitritun);

?hitritu.SetWindowTextW(hitritux);

***********************************


3 ● lizy
●40ポイント ベストアンサー

4.のところで整数同士の除算を行っているため、その結果も整数となり小数以下は切り捨てられることになります。

見たところ百分率を求める処理と思われるので、(hitn/scann)は0.0?1.0の結果になると思います。しかしながら結果が切り捨てられるため、0.0?0.999...の場合は0、1.0の場合のみ1となり、それを100倍した結果すなわち0または100が表示されることになります。

対策としては以下のような方法が考えられます。

前者の方法には若干問題があって、100倍した段階でintの表現できる範囲を超えてしまう可能性があります。対策として、使ったことはないのですがMulDiv()というWindows APIを使うとこの問題を回避できそうです(内部的に64bitの値で演算していると思われる)

hitritun = MulDiv(hitn, 100, scann)

MulDiv

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ