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


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

CString scanx;
int scann=0;

回答の条件
  • URL必須
  • 1人50回まで
  • 登録:2007/04/20 22:10:46
  • 終了:2007/04/22 12:58:53

ベストアンサー

id:lizy No.3

lizy回答回数45ベストアンサー獲得回数142007/04/22 01:00:01

ポイント40pt

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

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

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

  • 100倍してから割る -- hitn * 100 / scann
  • いずれか(両方でもよいです)をdoubleにして浮動小数で演算する -- (double)hitn / scann * 100

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

hitritun = MulDiv(hitn, 100, scann)

MulDiv

その他の回答(2件)

id:yo-kun No.1

yo-kun回答回数220ベストアンサー獲得回数302007/04/20 22:23:47

ポイント25pt

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

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


// CStringからint

scann = atoi( (LPCTSTR)scanx ) ;

// intからCString

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


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

id:mai_mai_mail

ありがとうございます。

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 *' に変換できません

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

よろしくお願いします。

2007/04/21 10:46:18
id:lizy No.2

lizy回答回数45ベストアンサー獲得回数142007/04/21 15:05:23

ポイント40pt

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")でも可

id:mai_mai_mail

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

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

2007/04/21 22:02:53
id:lizy No.3

lizy回答回数45ベストアンサー獲得回数142007/04/22 01:00:01ここでベストアンサー

ポイント40pt

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

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

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

  • 100倍してから割る -- hitn * 100 / scann
  • いずれか(両方でもよいです)をdoubleにして浮動小数で演算する -- (double)hitn / scann * 100

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

hitritun = MulDiv(hitn, 100, scann)

MulDiv

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • ■[VisualStudio] MFCおさらい すっかり浦島太郎・・ CString/intの変換を教えてください。 http://q.hatena.ne.jp/1177074643 CString -&gt; intは、以下のいずれかが使えます。 scann = _ttoi(scanx); // tchar.h scann = StrT
  • MFCおさらい すっかり浦島太郎・・ CString/intの変換を教えてください。 http://q.hatena.ne.jp/1177074643 CString -&gt; intは、以下のいずれかが使えます。 scann = _ttoi(scanx); // tchar.h scann = StrToInt(scanx); // sh
  • CString/intの変換には StrToInt()というのもあるよ いろいろ方法はあるけど、CStringからなら、これのほうが気持ちよく変換できる気がする scann = StrToInt(scanx); // shlwapi.h ネタ元 http://q.hatena.ne.jp/1
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません