メンバ変数にしているのにローカル変数と扱われてしまいます – プログラミング – Home

メンバ変数にしているのにローカル変数と...
 
通知
すべてクリア

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


mik
 mik
(@mik)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

はじめまして、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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

m_editの型はなんでしょうか?int型?

this->m_edit

としてもWarningがでますか?


返信引用
MASATO
 MASATO
(@MASATO)
ゲスト
結合: 19年前
投稿: 1
 

> エディットボックスのValueのメンバ関数m_editをつくり、
メンバ関数、ですか?

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

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


返信引用
んー
 んー
(@んー)
ゲスト
結合: 19年前
投稿: 14
 

>LPCTSTR(m_edit);
この行なに?


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

> LPCTSTR(m_edit);
これは,
LPCTSTR m_edit;
と同義ですから,LPCTSTR型の変数m_editを定義していることになります。
このm_editは初期化も代入もなされていないですから,
> myfile.WriteString(m_edit);
ここでのm_editの値は不定値です。
故に,警告が出たのでしょう。

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


返信引用
mik
 mik
(@mik)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

みなさん丁寧にお答えいただいてありがとうございます。

>エディットボックスの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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> 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
 mik
(@mik)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

無事解決しました。

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

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました