エラー「CXX0030 式を評価できません」

[戻る]
さみ 2007/12/12(水) 20:09:33
最近お世話になっております,さみです。
今回もよろしくお願いします。

環境は Windows2003/VisualC++ 2005/MFC・MDI です。


クラス間でメンバ変数のデータを共有させたいのですが,
「CXX0030 式を評価できません」エラーが連発している状態です。

やりたいことなのですが,CAViewの(int)max_dataをCBViewのメンバ変数(int)maxに代入
してデータを持たせたいと考えています。

(簡単に)プログラムを示しますと,
【AView.cpp】
CBView* pBview = new CBView;
pBView->max = max_data;

【AView.h】
#include "BView.h"
 :
 :
public:
    CBView* p_BView;

このような感じです。
そもそもpBiewのハンドルが「???」の状態になってしまっていますので,ハンドルを取得
できていないのだと思います。
色々調べたのですが,上記の方法でできるようだったのですが・・・できません。

不足している情報などがありましたらまた提示しますので,なんなりとご指摘ください。
どうかよろしくお願いします。

wclrp ( 'o') 2007/12/12(水) 20:31:33
デバッガで変数の値が見えないって意味か。
デバッグ用にコンパイルしてあるやつをデバッガで実行しているんだよね?

最適化してあってECXレジスタがthisを指してないとメンバ変数はデバッガで見れないぞ。
バッファオーバーランとかで値をおかしくしているとか。
エディットコンティニューが効いているならリビルドしてごらん。

デバッガで変数の値が見えないからといって共有できてないわけじゃないし。
てか、
CBView* pBview = new CBView;
の実行後いきなりpBiewがアクセスできない
メモリ(アドレス)を指しているポインタなのか?

たいちう 2007/12/12(水) 20:51:29
> そもそもpBiewのハンドルが「???」の状態になってしまっていますので,ハンドルを取得
> できていないのだと思います。

p_BViewはNULLじゃないけど、
p_BView->m_hWndが0(または不定)という意味ですか?

CBViewがCViewを継承しているとすると、コンストラクタでは、
ウィンドウと結びついていないということではないですか?
クラスのインスタンスがあっても、(OSに管理される)対応するウィンドウがなければ、
有効なハンドルがあるはずがない。

不足している情報は、とりあえず、、、

CBViewの継承元は?
CBViewのコンストラクタは何をしている?
このとき、扱いたいCBViewの実態はあるはず?

さみ 2007/12/12(水) 20:57:40
wclrp ( 'o')さん,素早いお返事,感謝します!!

VC++初心者なので,wclrp ( 'o')さんの書かれてることも意味を調べつつ解釈しました。
そのレベルの初心者だとご認識いただけたら幸いです。

さて,
>デバッグ用にコンパイルしてあるやつをデバッガで実行しているんだよね?
は,その通りだと思います。
リビルドもしてみたのですが,やはり同じ場所でひっかかりました。

またバッファオーバーランですが,これが起こるとは思えないんですが・・・
なんせmax_dataが一桁の整数なので・・・(という考え方があってるかわからないのです
が)。

>CBView* pBview = new CBView;
>の実行後いきなりpBiewがアクセスできない
>メモリ(アドレス)を指しているポインタなのか?
ここの部分の意味がちょっとわからないのですが,目的は「BViewのmax」としたいと思っ
ています。
これでは不適切なのでしょうか?

ご指導お願いします。

さみ 2007/12/12(水) 21:23:41
たいちうさん,お返事ありがとうございます!
またまた調べつつの解答になってしまったので,返事が遅くなってしまいました。

>p_BView->m_hWndが0(または不定)という意味ですか?
ですが,実行中(?)にCBView*にマウス乗せると {CBView ???} となり,
pBViewにマウスを乗せると 0xcccccccc{CBView ???}となるため,「ハンドルが取得でき
てないのかな?」と考えた次第です。

>CBViewの継承元は?
CFormViewです。(この答えで合ってるのかも不安。。)
ヘッダーファイルの
class CBView : public CFormView
から,こう答えました。

>CBViewのコンストラクタは何をしている?
ですが,コンストラクタを設定してないみたいです。
コンストラクタも何かわからなかったので調べて,自分のプログラムを照らしてみたので
すが,そのような宣言をしている部分がありませんでした。
設定した方がいいのでしょうか?

>このとき、扱いたいCBViewの実態はあるはず?
よって,実態もどうなっているのかわからない状態です。


わからないことだらけで申し訳ありませんが,とても勉強になるので,お付き合いいただ
けたら嬉しいです。
よろしくお願いします。

rin 2007/12/12(水) 21:54:37
一度プロジェクトを閉じて、
Releaseやdebugフォルダ(検索で探して2つあったらどっちも)を消す
ncbファイルも消す。

ソリューションのクリーンやソリューションのリビルドして
余計な中間ファイルを一度消す。

これらをやってから、立ち上げなおしてみてください

さみ 2007/12/13(木) 09:46:33
rinさん,アドバイスありがとうございます。

指定されたものを全て消して,リビルド等もして立ち上げてみました。
・・・ダメでした。同じエラーが出てしまいました。

「エラーで詰まったらncdファイルを消す」って手は良く使われるみたいですね。
覚えておきます!

maru 2007/12/13(木) 11:14:31
> ソリューションのクリーンやソリューションのリビルドして
> 余計な中間ファイルを一度消す。
この症状でファイル削除、リビルドしたところで何の解決にならんと思うが...

> pBViewにマウスを乗せると 0xcccccccc{CBView ???}となるため,
VC++でデバッグビルドした場合、変数は0xCCで初期化されます。
つまり、この現象はpBViewに対して代入が行なわれていないということ。
pBViewが0xccccccccだったのは代入前に値を確認したからではないかと推測します。
CBView* pBview = new CBView;
の行にブレークポイントをしかけて、ステップ実行してみてください。
ステップ実行後にpBviewの値が0xccccccccだったら手に負えない。

> コンストラクタも何かわからなかったので調べて,自分のプログラムを照らしてみたので
> すが,そのような宣言をしている部分がありませんでした。
BView.cppに
CBView::CBView()
{}
または
BView.hに
class CBView : public CFormView
{
public:
    CBView() : CFormView() {};
}
がありませんか?
無ければコンストラクタを追加して、コンストラクタにブレークポイントをかけて、
CBView* pBview = new CBView;
のコードから呼び出されているかを確認。

# なんかデバックの基礎講座みたい。

maru 2007/12/13(木) 11:20:16
ところで、
> 【AView.cpp】
> CBView* pBview = new CBView;
のpBViewと
> 【AView.h】
>     CBView* p_BView;
のp_BViewの関係は?
データ形がCBView*で同じだからといってpBViewとp_BViewは全く別物なんだけど。
何か勘違いしていませんか?

maru 2007/12/13(木) 11:42:56
もう一度よく読んでみると
> MFC・MDI> CBView* pBview = new CBView;> >CBViewの継承元は?
> CFormViewです。(この答えで合ってるのかも不安。。)
> ヘッダーファイルの
> class CBView : public CFormView
> から,こう答えました。
は、なんか変。

MFC・MDIでCFormViewを使うってことは、表示画面がCFormViewだと思うけど、
MFCのMDIアプリではViewをユーザがnewすることは一般的には無いはず。
# 普通はフレームワークが生成する。
ビューの管理をフレームワークに任せず、自分でやっているなら別だけど、
そこまではやっていないでしょ。

さみ 2007/12/13(木) 11:45:25
maruさん,コメントありがとうございます!

ステップ実行してみました。
maruさんのおっしゃる通り,代入前が0xccの状態でした。
そして,実行後には 0x00000000 {CBView ???} となって,そのあとアクセス違反が発生
するという事態です。

また,あとのコメントで書かれていることを考えてみたのですが,
ヘッダーの方にある宣言は間違いでpBViewのことを指したかったのです。
しかし考えてみるとその二つの命令は重複した内容のことをさせているんだと気づきました。
ですので.cppの方の命令をコメントアウトして実行させてみました。
そしたら先に述べたようになりました。

コンストラクタについてですが,.cppにはそのような記述がありました!
しかし.hには見つかりませんでした。見つからないと言っても
>    CBView() : CFormView() {};
の記述がないということなのですが,これは自然についているものなのでしょうか?
似たようなもので
protected:
 CBView();           // 動的生成で使用される protected コンストラクタ
  virtual ~CBView();
なのはありました。

ご指導よろしくお願いします!!

さみ 2007/12/13(木) 12:05:06
maruさん,本当にありがとうございます!

>ビューの管理をフレームワークに任せず・・・
は任せていると思います。

やはり
>>> CBView* pBview = new CBView;
が自分の間違いじゃないかと思っています。。

PATIO 2007/12/13(木) 12:13:15
釈迦に説法かもとも思いますけれど。

C++言語の文法自体が怪しいのではないかなぁと言う気がします。
MFCのクラスが云々と言う話ではない気がする。
C++言語の入門書にあるような単純化されたクラスで
C++言語の文法とクラスとは?みたいな部分を勉強した方が
実際には早道なのではないかなぁ。

さみ 2007/12/13(木) 12:54:13
PATIOさん・・・重々承知しています。。
全然回質問したときもそのように助言をうけたのですが,何分時間がなくて。
(あと一週間ないのです。。)

とは言っても必要な知識なので,手元にあるビギナー編の参考書のクラスの項をしっかり
読み返したいと思います!

ITO 2007/12/13(木) 13:11:17
MSDN CDのサンプルソースを見ましょう。
INETで探す必要はないです。
MSDN CDサンプル、特にMFC関連は種類が豊富です。
手始めに、チュートリアルのシリーズがお勧めです。

maru 2007/12/13(木) 13:13:46
> 全然回質問したときもそのように助言をうけたのですが,何分時間がなくて。
確か一ヶ月位前にそんなことを書いた覚えがありますね。
# その時もビューへのポインタ宣言とビューの実体との違いが分かっていなかったようだが。

で、本題の件ですが、CBViewへのポインタ(CBView*)は自分でnewするのではなく、
フレームワークから取得するか、呼び出し元で保持しているCBView*へのポインタを
渡すようにしてください。
# 全体のプログラム構成がどうなっているのか分からないので、詳細は不明。
# だからといって、プログラム全部をここに載せるのは勘弁してね。
この辺は前の時(約一か月前)のやり方が参考になるでしょう。

さみ 2007/12/13(木) 13:32:55
ITOさん,アドバイスありがとうございます!

CDのサンプルソースってことはMSDNのCDがないと見れないんですよね?
学校のパソコン&ソフトなので,MSDNがどこにあるのかわからないんです。
英語版はネットで公開されてるようですが・・・・日本語版もどこかありますか?
(調べてみたのですがわからず。。)

さみ 2007/12/13(木) 13:38:24
maruさん,毎回振る舞わしているにもかかわらずアドバイスしていただいて・・・ほんと
ありがとうございます!

確かに今読み返していますが,前回もポインタのあたりで質問してますね。。
せっかくアドバイスいただいているのに,活用できていなくて申し訳ないです。

しっかり読み返してみます!

ITO 2007/12/13(木) 13:41:57
なるほど、
MSDN LIBRARY
>http://msdn2.microsoft.com/ja-jp/library/default.aspx
ここで探してみるのもてですね。
google等で探すまえにここで調べるのもいいと思います。
MSDNのCDは見つけてみたほうがいいですね。

さみ 2007/12/13(木) 13:48:02
ITOさん,お返事ありがとうございます。

MSDN LIBRARYのページは参考にしています!
なかなか苦労しながら読んでいますが・・・

CDですが,教授が管理していますので聞いてみようと思いますが・・・出してくれる可能
性は低いです。。

ITO 2007/12/13(木) 15:10:59
> MSDN LIBRARYのページは参考にしています!
> なかなか苦労しながら読んでいますが・・・
慣れて下さい。
CDのほうが検索が早いだけで内容はほとんど同一です。

たいちう 2007/12/13(木) 20:29:31
> >このとき、扱いたいCBViewの実態はあるはず?
> よって,実態もどうなっているのかわからない状態です。

ハンドルという言葉が使われていましたので、ウィンドウハンドルの
ことかと思っていましたが、ポインタのつもりだったようですね。
いずれにしろ、maruさんが、

> で、本題の件ですが、CBViewへのポインタ(CBView*)は自分でnewするのではなく、
> フレームワークから取得するか、呼び出し元で保持しているCBView*へのポインタを
> 渡すようにしてください。

と、書かれているように、普通はCViewをnewできません。
普通じゃないことをさみさんが既にされているのかもと思い、
継承元やコンストラクタを聞いたのです。

さて、時間がないというのは分かりますが、
MDIで2種類のViewを使ったプログラムというのは、
C++を理解していないと無理ですよ。
回答者が手助けしようにも、さみさんの側で問題を説明することに失敗しています。
普通はこの辺りが、掲示板の限界です。
(まれに物凄いインスピレーションを持つ回答が付くこともありますが)

例えば、、、

ViewAとViewBがあって、それぞれに数字が表示されている。
ViewAをクリックすると、ViewAの数字がインクリメントされる。
ViewAを右クリックすると、ViewAの数字がViewBにコピーされる。
ViewBをクリックすると、ViewBの数字がインクリメントされる。
ViewBを右クリックすると、ViewBの数字がViewAにコピーされる。

このような仕様は理解できますか?
プログラムは作れますか?
右クリックすると、のあたりが、さみさんが作りたいプログラムに
少し似ていると思うのですが、全然違いますか?

このように具体的なプログラムならば、回答者も説明できます。
全然違う場合は、現在の問題についてだけ、何をしたいのか、
具体的な説明を試みてください。

たいちう 2007/12/13(木) 20:33:27
もう1つ。

もし参考にしているHP・書籍があれば書いてください。
ここのHPのこのプログラムを参考にしたけどうまくいかない、と。
書籍の場合はよほど出回っている本でないと、
その本を読める回答者がいる可能性が低いですが。

rin 2007/12/13(木) 21:44:04
>maruさんへ
>この症状でファイル削除、リビルドしたところで何の解決にならんと思うが...
ごめんなさい

ウチの仕事場の環境(XP、VC2005)では
ソースを弄ってからビルドしても、更新分がきちんと反映してなかったり、
ウォッチの値が「CXX0030 式を評価できません」になってしまうことが
何度か経験したことがあったので、同じようなことかもしれないと思ったのです。

本当にごめんなさい

さみ 2007/12/16(日) 11:11:25
アドバイスをくださったみなさん,返事が遅くなり大変申し訳ありません!!

ITOさん
何かわからないことがあると,まっさきにMSDNで調べるようにしています。
言葉は難しいけど,とても参考になっているサイトだと感じています。


たいちうさん
>さみさんの側で問題を説明することに失敗しています
そうみたいですね。つきあっていただけてるみなさんには本当に申し訳ないですが,私に
は確実にC++に対する知識が欠如しています。
補って,質問しなおすべきだと思いました。

>このような仕様は理解できますか?
>プログラムは作れますか?
使用は理解できます。プログラムも想像はできます。しかし,たぶん作れないと思います。
たいちうさんがおっしゃってる通り,私の質問の内容と同じであり,それを私が未だに解
決できずにいるからです。。

>参考にしているHP・書籍
色々なところを参考にさせていただいて,しかもそれらの知識がごちゃごちゃになってし
まっていて,HP・書籍を示せないです。。
整理つけて,また報告させていただきます!


rinさん
私にとっては「そんな対処法もあるのか!」という新しい知識となったので助かりました。
今後,その手を使わせていただくこともあるかと思います。



みなさんには本当に私の都合で申し訳ないのですが,期限が近いので,この部分とは違う
部分を手がけています。
また落ち着きましたら,再度,考えなおしていきたいと思います。

ITO 2007/12/17(月) 09:25:08
> ウチの仕事場の環境(XP、VC2005)では
> ソースを弄ってからビルドしても、更新分がきちんと反映してなかったり、
> ウォッチの値が「CXX0030 式を評価できません」になってしまうことが
> 何度か経験したことがあったので、同じようなことかもしれないと思ったのです。
VC6.0なら経験ありますね。
VC2005でもおきるんですね。
今回の場合、もうすでにソフト上おかしい所が見え隠れしていたので対象に
ならなかったのだと思います。

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