SetWindowText

解決


C++初心社  2007-05-10 22:51:00  No: 65087  IP: 192.*.*.*

void CMy5000000Dlg::OnBnClickedOk()
{   CString str  ;
    str = "我慢";
  CEdit* myED1 = (CEdit*)GetDlgItem(IDC_EDIT1);
     myED1->SetWindowText(str);
}

これってダメですか?
なんで以下のようなエラーがでるのでしょうか?
エラー  2  error C2065: 'str' : 定義されていない識別子です。  
エラー  1  error C3872: '0x3000': この文字を識別子で使用することはできません

編集 削除
Blue  2007-05-10 23:46:15  No: 65088  IP: 192.*.*.*

>CString str  ;
strの後ろに全角空白があるようですが、
VC6(だと思う)の場合、全角文字は使えないのはご存知でしょうか?

編集 削除
επιστημη  URL  2007-05-10 23:46:39  No: 65089  IP: 192.*.*.*

> CString str  ;

str と ; の間に "全角空白" が入ってんじゃない?

編集 削除
どら  2007-05-10 23:55:31  No: 65090  IP: 192.*.*.*

普通に作成してみたら、問題なくできますよ。
ソースの中に全角文字が入っていたり、変数名の大文字と小文字が違ってたりしませんか?

ちなみにあなたが書いている、このメッセージの中身をそのままコピペしたら、全く同じエラーが出ます。
当然です。

>CString str  ;

strの後に全角のスペースがありますよね?
MFCをやる前に、このような基礎をC、C++のコンソールプログラム(main関数などを使った、単純なプログラミング)から勉強してからはじめた方がよろしいかと思われます。

基本が大切・・・ですよ^^

編集 削除
yoh2  2007-05-10 23:56:58  No: 65091  IP: 192.*.*.*

> str と ; の間に "全角空白" が入ってんじゃない?
同感。

> エラー 1 error C3872: '0x3000': この文字を識別子で使用することはできません

'0x3000'はユニコードで全角空白を表わすコードポイントです。
'str<全角空白>'という識別子を定義しようとしてはねられる → エラー1。
当然、'str'という識別子も定義されない → エラー2。

と、こんな具合。

編集 削除
Kaz  2007-05-11 00:05:58  No: 65092  IP: 192.*.*.*

ありがとうございます!!!  
空白を与えてはいけないっていうのは目から鱗でした!
みなさんのおっしゃるとおりです。
質問ついでに2ヶ月ぐらいで中級プログラマぐらいになりたいのですが、
Visual C++2005ですが、どうやったら手っ取り早く成長できますか?
なにかいい勉強方などがあったら教えていただきたいのですが?
よろしくお願いします。

編集 削除
yoh2  2007-05-11 00:32:17  No: 65093  IP: 192.*.*.*

2ヶ月で中級……かなり難しいと思います。
手っ取り早い方法なんてまずないでしょう。

プログラミング能力が高く、教えるのもうまい師匠に出会って、つきっきりで教えて
もらうことができれば何とかならんでもないかも。
そこまででなくても、よい師匠は必須ではないかと思います。

独学だとしたら、「Windowsプログラミング」ではなく、「標準C++」を習得するのに、

1. よさげな入門書を読破。
2. ひたすらコードを書く & 人のコードを読む。
3. できることなら、C++の規格書もひととおり読んでおく。

くらいはしないと。
で、師匠が必須だといったのは、2でコードを書くための題材の提供 & コードの添削
をしてもらうため。
ゆっくり、いろんな人のコードに触れながらならともかく、急いで独学でやってしまうと
変なクセが付きかねないので。

さらにWindowsプログラミングを覚えるとしたら、MSDNのテクニカルノートを読んで
何を言っているかが理解できるレベルになるまでひたすらMSDNライブラリを読み漁る
& やっぱりひたすらコードを書く、かなぁ。
寝てる暇ないかも。

# 本格的にC++を始めてから3年。未だにC++中級を名乗るのが恥ずかしいレベルのyoh2。
# 「なんとなく」やってた時期を合わせると7〜8年。Cのキャリアも含めると11年。
# いや、私の場合、さすがに物覚え悪過ぎか(- ー;

編集 削除
C++初心社  2007-05-11 01:10:32  No: 65094  IP: 192.*.*.*

ちなみに
   CString str ;
    str = "我慢";
    CEdit* myED1 = (CEdit*)GetDlgItem(IDC_EDIT1);
     myED1->SetWindowText(str);
  
は○なのに、

    CString str = "我慢" ;
    
    CEdit* myED1 = (CEdit*)GetDlgItem(IDC_EDIT1);
     myED1->SetWindowText(str);

なんでこれはエラーがでるんですか?

>yoh2
ほんと、プログラミングの世界ってわけわかめな言語で埋め尽くされていますよね。でも参考になりました。ありがとうございます。大変な世界ですよね。

編集 削除
Blue  2007-05-11 01:18:31  No: 65095  IP: 192.*.*.*

>    CString str = "我慢" ;
頭に全角が2文字あります。


つうか、同じエラー(error C3872: '0x3000': この文字を〜)が出ている
じゃないのですかね?
(学習するってことはしないのかと。)

編集 削除
C++初心社  2007-05-11 01:53:31  No: 65096  IP: 192.*.*.*

>頭に全角が2文字あります。
すいません。これの意味がいまいちわかりません。

>(学習するってことはしないのかと。)
そんなあなたに朗報です!
師匠になってください!!!!

編集 削除
επιστημη  2007-05-11 06:18:06  No: 65097  IP: 192.*.*.*

> すいません。これの意味がいまいちわかりません。
"いまいち"は禁句。

全角空白があります。

> そんなあなたに朗報です!

ふざけてるとしか受け取れません。

編集 削除
どら  2007-05-11 09:48:56  No: 65098  IP: 192.*.*.*

> すいません。これの意味がいまいちわかりません。

半角/全角の違いは、プログラミング以前の問題では?
日本語文字入力の基礎から勉強しましょう。

>> そんなあなたに朗報です!
>ふざけてるとしか受け取れません。

同感です。
これでは「教えてください」ではなく「教えてもらってあげよう」と上から見下ろしているようにも取られかねます。
気をつけましょうね。

> 質問ついでに2ヶ月ぐらいで中級プログラマぐらいになりたいのですが、
> Visual C++2005ですが、どうやったら手っ取り早く成長できますか?
> なにかいい勉強方などがあったら教えていただきたいのですが?
> よろしくお願いします。

私もVC++を始めてからもう7年くらいになりますが、正直自分で「中級」にもたどり着けていないのかな・・・と思うくらいです。
「手っ取り早く」というのは、はっきりいって無理だと思います。
本人の地道な努力と経験が、その人のプログラムレベルをあげていくからです。

C++初心者さんの場合は、VC++でAPIやMFCを使う前に、C++の標準関数を使って、C++でプログラミングの基礎からしっかり勉強された方がいいと思います(ソースを書く際ののルール等)。

私は一時期、基礎を飛ばしてやりたいこと先行でプログラムを作成しまくっていたら、あっと言う間に行き詰まりました。
基礎を改めて勉強し、基礎の大切さを知りました。

ただ本やサイトにのっている事をうつして「動いた〜」ではなく、なぜそれで動いたのか、うまく動かなかったときにはなにがいけなかったのかをしっかり把握しながら進んでいけば、いいと思います。

ちなみに、私は「猫でもわかる・・・」に大変お世話になりました(今もたまにお世話になってます)。
今や本まで出版されていますね〜。

編集 削除
C++初心社  2007-05-11 10:50:29  No: 65099  IP: 192.*.*.*

みなさん、アドバイスありがとうございます。
     
    CString str = "我慢" ;
    
    CEdit* myED1 = (CEdit*)GetDlgItem(IDC_EDIT1);
     myED1->SetWindowText(str);
のどの変が全角空白なのか?わからないのですが
具体的にあげてもらえないでしょうか?
全部半角だとおおむのですが?

   CString str = "我慢" ;のCStringの前の部分が全角空白だというのであればCEdit* myED1もmyED1->も全角空白ということになりますが?
頭を全部そろえないといけないのでしょうか?
上級者の方にはばかばかしい質問かもしれませんが。本当に分からないのでよろしくおねがいします m(_ _)m

編集 削除
Blue  2007-05-11 10:55:03  No: 65100  IP: 192.*.*.*

全角文字の表示が見えるテキストエディタを使って、
ご自分のコードを貼り付けてみてはどうでしょうか?
(VC2005の設定で見えるようにできるかもしれないけど)

ちゅうか、
>2007/05/11(金) 01:10:32 

>2007/05/11(金) 10:50:29 
と貼り付けているコードが違うようですが、
>2007/05/11(金) 10:50:29 
のコード(全角空白は半角空白2文字になっている)でビルドしてもエラーが出るのでしょうか?
エラーが出るのであれば、省略せずにエラーメッセージを貼ってください。

編集 削除
Blue  2007-05-11 11:00:23  No: 65101  IP: 192.*.*.*

訂正

>全角文字の表示が見えるテキストエディタを使って、
全角空白文字の表示が見えるテキストエディタを使って、


フリーのエディタでも見えるように設定できます。
(Sakura Editor,Terapad,K2Editor等)

編集 削除
επιστημη  URL  2007-05-11 14:44:41  No: 65102  IP: 192.*.*.*

> のどの変が全角空白なのか?わからないのですが
> 具体的にあげてもらえないでしょうか?

いっそ"かな漢"をoffにしてもっぺん打ち直せば?

編集 削除
とおり  2007-05-11 17:06:29  No: 65103  IP: 192.*.*.*

2007/05/10(木) 22:51:00 
> CString str  ;
             ↑ ここ

2007/05/11(金) 01:10:32 
>ちなみに
>   CString str ;
  ↑ ここ

>は○なのに、
>    CString str = "我慢" ;
 ↑↑ ここ

貼り付けたコードだと全部だめそうな気がします。


半角スペース
1 2 3 4 5 6 7 8
全角スペース
1  2  3  4  5  6  7  8

半角文字
12345678
全角文字
12345678

この辺を勘違いしていたりしませんか?


>頭を全部そろえないといけないのでしょうか?
頭を揃えるのが重要ではなくて、半角スペースを
入れないとだめです。
そろえるならTABでもいけます。

編集 削除
とおり  2007-05-11 17:08:08  No: 65104  IP: 192.*.*.*

一番上の↑部分がずれてしまいました。
;の前の空白部を指しています。

編集 削除
C++初心社  2007-05-11 21:51:17  No: 65105  IP: 192.*.*.*

なんとかterapadで半角を意識しながらコード入力をしました。
みなさんのご指摘、真摯に受け止めたいと思っています。
ですがこんどは、違うエラーの様です。

{   CString str = "我慢";
    
    CEdit* myED1 = (CEdit*)GetDlgItem(IDC_EDIT1);
    myED1->SetWindowText(str);
}


エラー  1  error C2440: '初期化中' : 'const char [5]' から 'ATL::CStringT<BaseType,StringTraits>' に変換できません。

編集 削除
επιστημη  URL  2007-05-11 22:17:36  No: 65106  IP: 192.*.*.*

CString str = _T("我慢");

編集 削除
C++初心社  2007-05-11 23:03:18  No: 65107  IP: 192.*.*.*

>επιστημηさん
ご回答ありがとうございます。
回答の前に自己解決しました。
ですが、なんで初期化の時だけTを使ってキャストしないと
いけないのでしょうか?
CString str;
str = "我慢";
の時はキャストしないでもエラーがでなかったのに?
なぜですか? m(_ _)m

編集 削除
yoh2  2007-05-11 23:39:23  No: 65108  IP: 192.*.*.*

それ、キャストじゃありません。
tchar.h、Unicode、MBCSなどをキーにしてMSDNを探してみましょう。

# いい加減話題がずれてきたような。
# 新トピック立てた方がいいのでは?

編集 削除
C++初心社  2007-05-12 00:26:57  No: 65109  IP: 192.*.*.*

>yoh2さんごめんなさい。
最後に聞かせてください。
なぜ
CString str;
str = "我慢";
の時は_Tをつけなくても良かったのでしょうか?

編集 削除
Blue  2007-05-12 00:33:25  No: 65110  IP: 192.*.*.*

MSDN
http://msdn2.microsoft.com/en-us/library/wxeexhs7(VS.80).aspx
より

CString& operator=(
   const unsigned char* pszSrc
);

でうまいこと解釈されたのでしょう。

>CString str = "我慢";
ではなく

CString str("我慢");

ならコンパイルエラーにはならないでしょう。

編集 削除
Blue  2007-05-12 00:53:33  No: 65111  IP: 192.*.*.*

ちなみに

>CString str = "我慢";

http://msdn2.microsoft.com/en-us/library/cws1zdt8(VS.80).aspx
よりoperator=のようにconst unsigned char*のコンストラクタは
explicitが指定されているので、

CString str("我慢");

ではOKだけど

CString str = "我慢";

はNGになるようになっています。

編集 削除
C++初心社  2007-05-12 01:07:23  No: 65112  IP: 192.*.*.*

みなさん、ありがとうございました m(_ _)m
稚拙な私に付き合ってもらって。
みなさんのアドバイス大変勉強になりました。
また質問させて頂くと思いますが、そのときは呆れずに
答えてやってください。
Blueさん  επιστημηさん  yoh2さん
どらさん  とおり
短い間ですが親切に教えてくださってまことに感謝いたします。
では、ごきげんよう。さようなら。

編集 削除