CString 型を Double 型に変換するには

解決


りり  2005-09-08 22:37:43  No: 58898

はじめまして。eMbedded C++ 4.0 (Visual C++ 4.0のモバイル用開発環境)を使っています。ほぼ Visual C++ 4.0と一緒だと聞いておりますが、MFCは使っていません。

CString 型の変数を Double型に変換したいのですが、うまくいきません。
MSDNをせっせとあさって、atof関数を使えばいいらしいところまではこぎつけたのですが、真似しようとすると、やっぱりどこか違うようでエラーがでてしまいます。

  CString str2;
  double dNum;

  str2="0.234";
         dNum = atof(str);

これをコンパイルすると
error C2664: 'atof' : cannot convert parameter 1 from 'class CString' to 'const char *'
というエラーになります。どう変更するとうまくdouble型変数dNumに0.234という値を代入できるようになるのでしょうか?

お手数ですがよろしくお願いします。


俊朗  2005-09-08 23:11:47  No: 58899

エラーメッセージにてCStringクラスをconst char *に変換できないと
いわれていますので、こちらでそうなるように対処してやればいいでしょう。
つまり、CStringからchar *をとり出す関数を探してやり、
atof()にはそれを入れてみてください。

#GetBuffer()でいいのかな?


PATIO  2005-09-08 23:17:10  No: 58900

WindowsCEでは、文字コードはUnicodeで表記すると言う前提があるのですが、
その事はきちんと把握されているでしょうか?
CEでのCStringは、通常のWindowsでいうと_UNICODEが定義されてた状態と同じです。
確か、ASCIIコードでCStringに設定しても内部的にはUNICODEに変換されていると思います。
UNICODEはWCHARであってcharではありませんからこのままではatofには渡せません。
WindowsCEでは文字列はTCHARで扱う方が問題が少ないと思います。
TCHARはUNICODE環境ではWCHARで、マルチバイト環境ではcharで扱われます。

_tcstodを使えば行けると思うのですが、試してみてはどうでしょう。

WindowsCEでプログラミングする場合の基本知識になりますので、
おさえておく方が良いと思います。


シャノン  2005-09-08 23:19:50  No: 58901

MFC 使ってないのに CString は使っているとはこれ如何に?
ちなみに VC++ 7.1 の CString には変換演算子が定義されているので成功しました。
eVC++ 4.0 にはないのかな。

GetBuffer は目的が違う期がする。


シャノン  2005-09-08 23:20:32  No: 58902

> WindowsCEでは、文字コードはUnicodeで表記すると言う前提があるのですが、

それは知らなかった。でしゃばってゴメンナサイ。


PATIO  2005-09-08 23:20:54  No: 58903

> MFCは使っていません。

と書いておいてCStringを使っているのは矛盾があると思います。
CStringもMFCの一部ですよ。
ウインドウ制御にMFCを使ってないと言う意味なのかな?

あと、Visual C++ 4.0と同じと言うのもどうかと思いますが、
時期的に言ってもVC++6.0と同じと考えるべきだと思いますよ。


PATIO  2005-09-08 23:21:45  No: 58904

あっ、シャノンさんとバッティング。(^^;


りり  2005-09-08 23:59:51  No: 58905

俊朗さん、PATIOさん、シャノンさん、メッセージありがとうございます。

そういえばCStringもMFCの一部でしたね。ちょっと誤解していました。
最初、俊朗さんのアドバイスをもとにこのように変更してみました。
  dNum = atof( (const char*)str.GetBuffer(0));
エラーはでなくなったのですが、
  str.Format(_T("%4.1f"),dNum);
  AfxMessageBox(str);
で出力させると、「0.0」という値が帰ってきます。。。

PATIOさんに教わった _tcstodという関数と、WCHAR型でなくちゃダメという
情報で
    WCHAR   *string;
    dNum= _tcstod(str,&string);
としてみたところ、無事欲しい数字がでてきました。

ありがとうございました。


りり  2005-09-09 00:00:27  No: 58906

すみません、解決にチェックをいれるのを忘れてました(^_^;


PATIO  2005-09-09 01:32:49  No: 58907

蛇足かもしれませんが、

WindowsCEの場合、通常のPC上で動いているWindowsに比べて
色々な制約や特殊な前提条件等があります。
WindowsCEでプログラミングをするのであれば、
この辺の基礎知識をしっかり押さえておくようにした方がいいです。
この辺りの知識がないままに勧めていると大ハマリする可能性がありますので。


PATIO  2005-09-09 01:33:49  No: 58908

誤)
この辺りの知識がないままに勧めていると大ハマリする可能性がありますので。

正)
この辺りの知識がないままに進めていると大ハマリする可能性がありますので。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加