はじめまして、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はメンバ変数なのに、なぜローカル変数と認識されているのでしょうか?
よろしければご教授お願いいたします。
m_editの型はなんでしょうか?int型?
this->m_edit
としてもWarningがでますか?
> エディットボックスのValueのメンバ関数m_editをつくり、
メンバ関数、ですか?
m_editの定義はどうなっていますか?
警告がでるのはどの行ですか?
>LPCTSTR(m_edit);
この行なに?
> LPCTSTR(m_edit);
これは,
LPCTSTR m_edit;
と同義ですから,LPCTSTR型の変数m_editを定義していることになります。
このm_editは初期化も代入もなされていないですから,
> myfile.WriteString(m_edit);
ここでのm_editの値は不定値です。
故に,警告が出たのでしょう。
んーさんが既に書かれていますが,
> LPCTSTR(m_edit);
の行の意味次第です。
意味がないのであれば取っ払うと良いでしょう。
みなさん丁寧にお答えいただいてありがとうございます。
>エディットボックスの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を使う必要があるのでしょうか?
再度よろしくお願いします。
> 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をしてくださいという意味です。
無事解決しました。
ご指摘のとおり、キャストは単にデータ型を変換することという甘い認識で
行っていました。
書いていただいたソースコードを
CStdioFile myfile(cfdFileDlg.GetPathName(),
CFile::modeCreate | CFile::modeWrite);
の後に置き換えることによって正常に動作しました。
Blueさん、MASATOさん、んーさん、YuOさん、
ご助力非常に感謝します。本当にありがとうございました。
解決になっていますけれど、
C++言語そのものの知識が怪しいのであれば、
いきなりMFCを使ってウインドウを出すプログラムを作るのではなくて
MFCを使わないでコンソールプログラムで勉強した方がいいです。
言語の勉強とMFCの勉強をいっぺんにやってしまうと
一つのプログラムを作るのに広範囲な知識が必要になるので
勉強向けではないです。
一つ一つ分けて勉強した方がハマリにくいです。