メンバ変数にしているのにローカル変数と扱われてしまいます

[戻る]
mik 2006/05/15(月) 01:42:13
はじめまして、C++を始めて一ヶ月の初心者です。

WindowsXPのVisualC++2005のMFCアプリケーションで
ダイアログベースのプログラムを書いています。
単純に開始を押したら計算結果をエディットボックスに表示し、
表示されたものをファイルに保存するという内容です。
エディットボックスのValueのメンバ関数m_editをつくり、
それにintで定義した計算結果を代入すると表示はできたのですが、
保存することができません。
コードは以下のとおりです。

void CKADAI15Dlg::OnBnClickedKaisi()
{
 int a,b,c;
    a=10;
    b=5;
    c=a+b;
 m_edit=c;
 UpdateData(FALSE);
}

void CKADAI15Dlg::OnBnClickedHozon()
{
 CString text1,text2;
     text1="txt";
    text2="Text files (*.txt)|*.txt|All files(*.*)|*.*||";
 CFileDialog cfdFileDlg(FALSE, text1, NULL, 
    OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, text2, this);    
 if(cfdFileDlg.DoModal()==IDOK){

 UpdateData(TRUE);
 CStdioFile myfile(cfdFileDlg.GetPathName(),
        CFile::modeCreate | CFile::modeWrite);
 LPCTSTR(m_edit);
 myfile.WriteString(m_edit);
    }
}

これでビルドは可能なのですが、
"C4700: 初期化されていないローカル変数 'm_edit' が使用されます"
の警告が出てしまいます。
m_editはメンバ変数なのに、なぜローカル変数と認識されているのでしょうか?


よろしければご教授お願いいたします。

Blue 2006/05/15(月) 01:52:21
m_editの型はなんでしょうか?int型?

this->m_edit

としてもWarningがでますか?

MASATO 2006/05/15(月) 02:29:35
> エディットボックスのValueのメンバ関数m_editをつくり、
メンバ関数、ですか?

m_editの定義はどうなっていますか?

警告がでるのはどの行ですか?

んー 2006/05/15(月) 10:10:38
>LPCTSTR(m_edit);
この行なに?

YuO [E-Mail] 2006/05/15(月) 11:39:18
> LPCTSTR(m_edit);
これは,
LPCTSTR m_edit;
と同義ですから,LPCTSTR型の変数m_editを定義していることになります。
このm_editは初期化も代入もなされていないですから,
> myfile.WriteString(m_edit);
ここでのm_editの値は不定値です。
故に,警告が出たのでしょう。

んーさんが既に書かれていますが,
> LPCTSTR(m_edit);
の行の意味次第です。
意味がないのであれば取っ払うと良いでしょう。

mik 2006/05/15(月) 17:03:04
みなさん丁寧にお答えいただいてありがとうございます。

>エディットボックスのValueのメンバ関数m_editをつくり
間違いです。正しくは"メンバ変数m_edit"でした。失礼しました。


>m_editの型はなんでしょうか?
>m_editの定義はどうなっていますか?
m_editは、エディットボックスのメンバ変数として、メンバ変数の追加ウィザードから
作成しました。
   アクセス:public   変数の種類:int   変数名:m_edit
    コントロールID:IDC_EDIT1          コントロールの種類:EDIT
  カテゴリ:Value
するとDDXの部分が追加されました。

void CKADAI15Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT1, m_edit);
}


> this->m_edit としてもWarningがでますか?
CFileDialogの中のthisを定義するということでしょうか?
LPCTSTR(m_edit);を消去し、

・CFileDialog cfdFileDlg(FALSE, text1, NULL, 
    OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, text2, this);    
・if(cfdFileDlg.DoModal()==IDOK){

の後にそれぞれ入れてみましたが、やはりエラーがでてしまいました。


>警告がでるのはどの行ですか?
最後の行 myfile.WriteString(m_edit); です。

>LPCTSTR(m_edit);この行なに?
これはWriteStringを動作させるために、m_editがLPCTSTR型である必要が
あるかと思い挿入しました。これを消すと、警告はなくなりますがエラーで
 "C2664: 'CStdioFile::WriteString' : 
  1 番目の引数を 'int' から 'LPCTSTR' に変換できません。"
と出ます。
LPCTSTRは定義するのでなく、変換する必要があるのでしょうか?
そのためにthisを使う必要があるのでしょうか?

再度よろしくお願いします。

Blue 2006/05/15(月) 17:08:00
> myfile.WriteString(m_edit);
WriteStringはint型の引数をとらないからエラーがでて当然です。

といって、安易にキャストするのは完全に間違いです。

CString s;
s.Format( _T( "%d" ), this->m_edit );
myfile.WriteString( s );

というように、一度CString型変数に数字を文字列化してWriteStringをよんでくださ
い。


> CFileDialogの中のthisを定義するということでしょうか?
ちがいます。
明示的にCKADAI15Dlgのメンバ変数のm_editをしてくださいという意味です。

mik 2006/05/15(月) 17:52:16
[[解決]]
無事解決しました。

ご指摘のとおり、キャストは単にデータ型を変換することという甘い認識で
行っていました。
書いていただいたソースコードを
CStdioFile myfile(cfdFileDlg.GetPathName(),
        CFile::modeCreate | CFile::modeWrite);
の後に置き換えることによって正常に動作しました。

Blueさん、MASATOさん、んーさん、YuOさん、
ご助力非常に感謝します。本当にありがとうございました。

PATIO 2006/05/17(水) 11:52:40
解決になっていますけれど、
C++言語そのものの知識が怪しいのであれば、
いきなりMFCを使ってウインドウを出すプログラムを作るのではなくて
MFCを使わないでコンソールプログラムで勉強した方がいいです。
言語の勉強とMFCの勉強をいっぺんにやってしまうと
一つのプログラムを作るのに広範囲な知識が必要になるので
勉強向けではないです。
一つ一つ分けて勉強した方がハマリにくいです。

古いスレッドには追加発言できません。