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) ;
}
回答(5件)
- 最新から表示
- |
- 回答順に表示
- |
- ベストアンサーのみ表示
No.5ベストアンサー20pt
両方ダメ。
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はまったく別物です。
この回答へのお礼
いつも回答ありがとうございます。
>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++をやるためにクラスとその他少ししか勉強していなかったので。
#いつも本当にありがとうございます。私のレベルに合わせた根拠付き回答で大変よくわかります。
こんにちは、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");
ではないですよね。
この回答へのお礼
回答ありがとうございます。
>だという根拠はなんでしょうか?
すみません。根拠はありません。
>それと、質問に付随する状況を小出ししない方がいいですよ。
要点を絞ろうとしましたが、今回は大はずれでした。
>あと、ネットで拾ったコードはまずネットで作者本人に確認を試みてから質問して方がいいと思いますよ。
Q&Aサイトの過去ログで見つけたため聞くことが出来ませんでした。
>CString aaa ;
>aaa = CString("999");
>ではないですよね。
本来はそうなのでしょうが、今回は無理やり合わせこもうとして、まったくの出鱈目になってしまったようです。
No.3ベストアンサー10pt
例にあげたコードなら,動くこともあるし,動かないこともあるでしょう。なにせ,m_array.GetAt[i]の内容は,その挙げたコード以外の場所で決定される。要するに動かなければ,他の場所に原因があるというお話。
しかし,パターンA。
>str = (CString*)("999");
この文は駄目です。はっきりいって出鱈目。出鱈目キャストです。正しくはこう。
str = &CString("999");
C++言語の基礎理解が足りない様に思います。教本のキャストやポインタ参照の項を再読してください。
パターンBのものは,普通,
aaa = CString("999");
と記述されるものです。
これは,CString::CString(LPCSTR lpsz) というCStringの宣言(参考URL参照)があるので有効となります。
パターンAの正しい形は,これにポインタ参照の &演算子 を付けたもの。
この回答へのお礼
回答ありがとうございます。
あまりにも出鱈目だったようです。(^^ゞ
#出鱈目ってこんな字だったのですね。
(CString*)("999");
この部分は無理があると思います。
この回答へのお礼
回答ありがとうございます。
ネット上で見つけた以下のコードが動かないので簡略化して質問しました。
以下のコードの場合も同じことが言えるのではないかと思うのですが、書いた人は動いているようです。
*************************
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) ;
}
}
「不正なアドレスを参照している」から。
CString* str ;
は、CString型の変数を指すポインタstrの宣言
CString aaa ;
は、CString型の変数aaa
strにはTextOutに渡すべき正しいアドレスが、aaaはCString型の変数そのものなので、アドレスとして不正。
この回答へのお礼
回答ありがとうございます。
>strにはTextOutに渡すべき正しいアドレスが、
>aaaはCString型の変数そのものなので、アドレスとして不正。
strのほうがNGで
aaaのほうがOKなのですが。。。。
- 最新から表示
- |
- 回答順に表示
- |
- ベストアンサーのみ表示











