始めまして、
現在eMbedded Visual C++3.0にてアプリケーションの開発を
行っております。
早速質問ですが、
EDITに画面上から入力させた文字列を数値に変換させて計算をして
表示したいのですが...
現在のコードです。
CString a, b;
long c = 0;
char d[15];
edtA.GetWindowText(a); //画面入力値取得
edtB.GetWindowText(b); //画面入力値取得
//計算
c = atol(a) * atol(b); //<-----エラー個所(ここで落ちます)
_ltoa(c, d, 0);
edtC.SetWindowText(d); //計算結果画面出力
過去ログを検索しながら以上のようにコードを作成したのですが、
コンパイル時に以下のようなエラーが表示されます。
error C2664: 'atol' : cannot convert parameter 1 from 'class CString' to 'const
char *'
No user-defined-conversion operator available that can perform this
conversion, or the operator cannot be called
内容は引数をコンバートできないとのことです。
ちょっとしたことでもかまいませんお分かりになられる方は
ご教授ください。
よろしくお願いいたします。
PS:長文になってしまい申し訳ありません。
atol()の引数に対して(LPCTSTR)のキャストをしてみて下さい。
環境Win98+VC6.0+MFC
コンパイルエラーにはなりませんでした。
CString::operator LPCTSTR が働くようです。
私の環境では一応動作しました。(^^;
まず、CEなのですから、UNICODE環境であるということを理解しましょう。
UNICODEはWCHARですから、atolは使えるでしょうか?
WCHARを使える別の関数を使うようにするべきです。
UNICODE環境のCStringは、LPCTSTR型に変換可能ですが、
これは、const WCHAR* と同意だったと思います。
いずれにせよ、atolはchar*の変数を要求しますから使用できません。
CEでは、ランタイム関連の関数もWCHARに対応した物を使わないと駄目です。
CEの入門書にはそういったことが書いてあったと思うのでよく読んでみられた方が
良いと思います。
くたくた様、Bun様、PATIO様
早速のレス大変ありがとうございます。
> c = atol(a) * atol(b); //<-----エラー個所(ここで落ちます)
ここの部分を
c = atol(LPCTSTR(a)) * atol(LPCTSTR(b));
に変更してコンパイルしてみました。
実際Visual C++6.0のWINDOWS2000上のアプリケーションは
問題なくコンパイルされました。
PATIO様のおっしゃる通りに
CEをもう少し勉強してから、再度作成したいと思います。
CEがUNICODE環境だということも初めて知りました。
貴重なお時間本当にありがとうございました。
補足です。
PATIO さんがおっしゃっているように、LPCTSTRは、UNICODE環境ではconst WCHAR*
であり、非UNICODE環境ではconst char*です。意味的には、const TCHAR*に等しいです。
なぜなら、TCHARは、UNICODE環境ではWCHAR、非UNICODE環境ではcharだから。
MSDNで、『汎用テキスト』をキーワードにして調べてみてください。
汎用テキストを使用すれば、1つのソースでUNICODE版と、MBCS版の実行形式を作成すること
も可能です。
char型は、TCHARを使えばよいですし、atol()は、_ttol()を使えばよいです。
文字列は、_T(ほげほげ)のように、_Tマクロでくくればいいでしょう。
CStringは、TCHARベースなので、そのまま使えます。
UNICODE版のCStringには、LPCTSTRではなく、LPCSTRを直接受け取るコンストラクタや代入
演算子もあるので、MBCS文字列を渡すことも出来ます。この場合は、その中でUNICODEに変換
して保持するようです。
お世話になっております。
遅くなりました。
皆さんの協力の下、答えがどうにか見つかりました。
クラフトマン様が教えてくれた_ttoi()を使用しました。
そこからのCStringへの変換は、formatを使用しました。
果たしてこれが本当の答えになっているかはわかりませんが...
以下がそのソースです。
CString a, b, c; //変数定義
edtA.GetWindowText(a); //画面入力値取得
edtB.GetWindowText(b); //画面入力値取得
c.Format(_T(%d), _ttoi(a) + _ttoi(b)); //計算
edtC.SetWindowText(c); //計算結果画面出力
一応問題なく動いています。
コード自体もだいぶすっきりしました。
皆さんご協力ありがとうございました。