• ベストアンサー

dc.TextOut(0 ,0 , *str) ;について

環境 WIN98 VC++6.0 MFC にて パターンBはOKですが、パターンAだと不正な処理で落ちてしまいます。 どうしてなのかお教えください。 void CFffView::OnPaint() { CPaintDC dc(this); //パターンA CString* str ; str = (CString*)("999"); dc.TextOut(0 ,0 , *str) ; //パターンB CString aaa ; aaa = (CString)("999"); dc.TextOut(0 ,0 , aaa) ; }

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.5

両方ダメ。 Aのパターンで動くのは、たまたま。 CString aaa ; aaa = "999"; dc.TextOut(0 ,0 , aaa) ; これで十分。 あえてキャストするんだったら、 CString aaa ; aaa = (LPCSTR)"999"; dc.TextOut(0 ,0 , aaa) ; aaa=のところでは、ただの代入が行われているわけではありません。 オーバーロードされたオペレータが呼ばれています。 >str = (CString*)m_array.GetAt(i) ; これは、m_arrayの要素にCString*を入れていて、初めて成り立つ式です。 値をいれているところと、m_arrayの宣言を確認してください。 str = (CString*)("999"); も、 aaa = (CString)("999"); も、リテラル文字列をつっこもうとしています。 リテラル文字列とCStringはまったく別物です。

VitaminBB
質問者

お礼

いつも回答ありがとうございます。 >Aのパターンで動くのは、たまたま。 なるほど。 >あえてキャストするんだったら、 >CString aaa ; >aaa = (LPCSTR)"999"; >dc.TextOut(0 ,0 , aaa) ; なるほど。なるほど。 >オーバーロードされたオペレータが呼ばれています。 確かにそうでした。 >str = (CString*)m_array.GetAt(i) ; >これは、m_arrayの要素にCString*を入れていて、初めて成り立つ式です。 >値をいれているところと、m_arrayの宣言を確認してください。 確かにそうですね。CString*を入れていなかったので落ちてました。 >リテラル文字列とCStringはまったく別物です。 小規模でもアプリめいたものを作ると生活の時間がすべて奪われてしますので、しばらく休むことにします。 これを機にC++を勉強してみたいと思います。 これまではVC++をやるためにクラスとその他少ししか勉強していなかったので。 #いつも本当にありがとうございます。私のレベルに合わせた根拠付き回答で大変よくわかります。

その他の回答 (4)

noname#4877
noname#4877
回答No.4

こんにちは、BOUNDARYです。  解答でなくて申し訳ないのですが、 void CChildView::OnPaint() { CPaintDC dc(this); CString* str ;  for(int i = 0 ; i < 20 ; i++ )  {  str = (CString*)m_array.GetAt(i);  dc.TextOut(0 , i * 20 , *str);  } } を簡略化したら CString* str; str = (CString*)("999"); や CString aaa ; aaa = (CString)("999"); だという根拠はなんでしょうか? それと、質問に付随する状況を小出ししない方がいいですよ。 あと、ネットで拾ったコードはまずネットで作者本人に確認を試み てから質問して方がいいと思いますよ。 *ps. CString aaa ; aaa = CString("999"); ではないですよね。

VitaminBB
質問者

お礼

回答ありがとうございます。 >だという根拠はなんでしょうか? すみません。根拠はありません。 >それと、質問に付随する状況を小出ししない方がいいですよ。 要点を絞ろうとしましたが、今回は大はずれでした。 >あと、ネットで拾ったコードはまずネットで作者本人に確認を試みてから質問して方がいいと思いますよ。 Q&Aサイトの過去ログで見つけたため聞くことが出来ませんでした。 >CString aaa ; >aaa = CString("999"); >ではないですよね。 本来はそうなのでしょうが、今回は無理やり合わせこもうとして、まったくの出鱈目になってしまったようです。

  • onosuke
  • ベストアンサー率67% (310/456)
回答No.3

例にあげたコードなら,動くこともあるし,動かないこともあるでしょう。なにせ,m_array.GetAt[i]の内容は,その挙げたコード以外の場所で決定される。要するに動かなければ,他の場所に原因があるというお話。 しかし,パターンA。 >str = (CString*)("999"); この文は駄目です。はっきりいって出鱈目。出鱈目キャストです。正しくはこう。 str = &CString("999"); C++言語の基礎理解が足りない様に思います。教本のキャストやポインタ参照の項を再読してください。 パターンBのものは,普通, aaa = CString("999"); と記述されるものです。 これは,CString::CString(LPCSTR lpsz) というCStringの宣言(参考URL参照)があるので有効となります。 パターンAの正しい形は,これにポインタ参照の &演算子 を付けたもの。

参考URL:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cstring.3a3a.cstring.asp?frame=true
VitaminBB
質問者

お礼

回答ありがとうございます。 あまりにも出鱈目だったようです。(^^ゞ #出鱈目ってこんな字だったのですね。

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.2

(CString*)("999"); この部分は無理があると思います。

VitaminBB
質問者

お礼

回答ありがとうございます。 ネット上で見つけた以下のコードが動かないので簡略化して質問しました。 以下のコードの場合も同じことが言えるのではないかと思うのですが、書いた人は動いているようです。 ************************* m_array はCptrArrayで、要素はCString*です。とありました。 void CChildView::OnPaint() { CPaintDC dc(this); CString* str ; for(int i = 0 ; i < 20 ; i++ ) { str = (CString*)m_array.GetAt(i) ; dc.TextOut(0 , i * 20 , *str) ; } }

  • tksoft
  • ベストアンサー率36% (99/273)
回答No.1

「不正なアドレスを参照している」から。 CString* str ; は、CString型の変数を指すポインタstrの宣言 CString aaa ; は、CString型の変数aaa strにはTextOutに渡すべき正しいアドレスが、aaaはCString型の変数そのものなので、アドレスとして不正。

VitaminBB
質問者

お礼

回答ありがとうございます。 >strにはTextOutに渡すべき正しいアドレスが、 >aaaはCString型の変数そのものなので、アドレスとして不正。 strのほうがNGで aaaのほうがOKなのですが。。。。

関連するQ&A

専門家に質問してみよう