例)以下の2つの変数でお互いに変換して代入する方法を教えてください。
CString scanx;
int scann=0;
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)
お互いに変換して代入の意味が良くわかりませんが
こういうことでしょうか?
// CStringからint
scann = atoi( (LPCTSTR)scanx ) ;
// intからCString
scanx.Format( "%d", scann ) ;
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);
***********************************
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)
ありがとうございます。
CStringからintへの変換ではおっしゃるとおりに書くと次のエラーが発生してしまいます。
error C2664: 'atoi' : 1 番目の引数を 'LPCTSTR' から 'const char *' に変換できません
intからCStringでは次のエラーが出ます。
エラー 2 error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : 1 番目の引数を 'const char [3]' から 'const wchar_t *' に変換できません
どのようにすればいいかわかりますでしょうか?
よろしくお願いします。