環境 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) ;
}
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はまったく別物です。
いつも回答ありがとうございます。
>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++をやるためにクラスとその他少ししか勉強していなかったので。
#いつも本当にありがとうございます。私のレベルに合わせた根拠付き回答で大変よくわかります。
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");
ではないですよね。
回答ありがとうございます。
>だという根拠はなんでしょうか?
すみません。根拠はありません。
>それと、質問に付随する状況を小出ししない方がいいですよ。
要点を絞ろうとしましたが、今回は大はずれでした。
>あと、ネットで拾ったコードはまずネットで作者本人に確認を試みてから質問して方がいいと思いますよ。
Q&Aサイトの過去ログで見つけたため聞くことが出来ませんでした。
>CString aaa ;
>aaa = CString("999");
>ではないですよね。
本来はそうなのでしょうが、今回は無理やり合わせこもうとして、まったくの出鱈目になってしまったようです。
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?ur …
No.2
- 回答日時:
(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) ;
}
}
No.1
- 回答日時:
「不正なアドレスを参照している」から。
CString* str ;
は、CString型の変数を指すポインタstrの宣言
CString aaa ;
は、CString型の変数aaa
strにはTextOutに渡すべき正しいアドレスが、aaaはCString型の変数そのものなので、アドレスとして不正。
回答ありがとうございます。
>strにはTextOutに渡すべき正しいアドレスが、
>aaaはCString型の変数そのものなので、アドレスとして不正。
strのほうがNGで
aaaのほうがOKなのですが。。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# C# 浮動小数の数値文字列化 1 2022/04/18 15:15
- エアコン・クーラー・冷暖房機 24V仕様のキャンピングカー用クーラーを自宅で使用したい。 4 2023/05/30 15:40
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
戻り値で構造体を返すことは可...
-
init関数の意味
-
fopne で失敗する原因
-
ハンドルはポインタか
-
Run-Time Check Failure #3とい...
-
C言語のポインタに直接アドレス...
-
C言語の関数と配列に関する質問
-
アプリを32bitから64bit移行
-
VBはCを混乱させる?
-
プログラミングのfarについて
-
連結リスト 要素の入れ替え
-
C言語でのconstを返す関数
-
コンストラクタでnewを失敗した...
-
入れ子の構造体について
-
[excel vba] マウスポインタの...
-
VB6でのgethostbyaddrの使用方...
-
エラーの意味
-
デバイスハンドルとは?
-
ExcelVBAでのkernel32(64bit)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
C言語の関数と配列に関する質問
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
セグメントエラー
-
アプリを32bitから64bit移行
-
コンストラクタでnewを失敗した...
-
ExcelVBAでのkernel32(64bit)
-
Cで作成したDLL関数をVBから呼...
-
ハンドルはポインタか
-
DLL<->VB間での受け渡し(文字...
-
C言語でのconstを返す関数
-
ポインタについて
-
参照型で受け取った引数をポイ...
-
TCHAR文字列内の検索について
-
デバイスハンドルとは?
-
基本アルゴリズムの『返す』の...
おすすめ情報