★初心者にVisual C++を教えるスレ★ Part12

このエントリーをはてなブックマークに追加
899デフォルトの名無しさん:04/07/01 21:35
VC++ .NET 2003でビルドするたびにリソースのバージョン番号を
増やしていってくれるような仕組みってありませんか?
VC++6用のシェアウェアはあるようですが。
Visual SourceSafeかなんかでできるんでしょうか?
>>898
ならない。
>>898
そもそもMFCだけでまともなコーディングが出来ん。
>>898
MFCのソースを軽くでいいから覗いてごらん
903デフォルトの名無しさん:04/07/02 17:30
最近、VCを習い始めたのですが、
ビルドは通るのにexeを実行すると、すかさず下記のエラーがでる。という症状が何回か出て参っています。

「XXXXの命令がXXXXのメモリを参照しようとしました。メモリがreadになる事は有りませんでした。」

このエラー原因の可能性としては、どのような点があるでしょうか?
何回かこのエラーが出くわしたのですが、このエラーが出るたびにバックアップから作り直し、
3歩進んで2歩下がる状態で開発が進んでいます。作り直すとなぜかエラーが出なくなります…
>>903
>ビルドは通るのに

文法上は正しくても動作としておかしなコードが混じっているからそうなる。
バッファの取り扱いに注意。

一連の初期化処理の中におかしなところがあるんだろう。詳しいことはプログラム
の中を見ないとわからない。

あるいはビルドを繰り返しているうちにそうなるなら、中間ファイル類を全て削除して
からビルドしなおしてみる。
905デフォルトの名無しさん:04/07/02 17:46
>>904
回答有り難うございます。
Debugフォルダを全削除して、ビルドしなおしたら直りました。
バグみたいなもの?
VCってワケわからんです。もうツカレタ…orz
>>903
ぬるぽっ
>>905
エラーが出た状態のままの中間ファイルが残ったため。
VCはビルドするとき、ファイルの日時を見てビルド対象を決めているが、
その時エクスプローラーが邪魔すると、
お互い待ち状態になったり、日時の確認を中断してビルド続行してしまったりする。
>>905
もう一度ソースを確認することをお勧めする
それで治ったってのはただの偶然の可能性もあるよ
ちなみに、上記のエラーは一般アプリが読んでははいけないと
マークしているメモリを読もうとしたために起きたエラー

ちなみにデバッガ上でやってもそうなる?
デバッガ上でも出るならデバッガ使って原因を追求するべきだし
デバッガが使えないのなら、ワトソン博士にコアダンプ吐かせても良いかも
mapファイルの作成は忘れずにね

904が言うようにオブジェクトのリンクに際して起きる場合もあるかも
もし多人数で開発しているのなら、各PCの時計を正確に合わせておいたほうがいいよ
そもそも>>903はデバッグ方法全然知らんだろ?
リファレンスくらい目を通しとけ。
910(1/3):04/07/02 21:34
すいません、次のようなクラス・ファイル構成で実行時エラーが出ます。
解決策等をご存知でしたらご教授ください。

--- fuga.h ---
#ifndef __fuga_h__
#define __fuga_h__

class hoge;

class fuga{
  hoge* pHoge_;
public :
  void SetHoge(hoge* pHoge) { pHoge_ = pHoge; }
};

#endif// __fuga_h__
911(2/3):04/07/02 21:35

--- hoge.h ---
#ifndef __hoge_h__
#define __hoge_h__

#include "fuga.h"

class hoge{
  int x;
};

class hogehoge{
  fuga* pFuga;
public :
  void SetFuga(void){
    pFuga->SetHoge(new hoge);
  }
};

#endif// __hoge_h__
912デフォルトの名無しさん:04/07/02 21:35
--- test.cpp ---
#include "hoge.h"

int main(void){
hogehoge* pHogehoge = new hogehoge;
pHogehoge->SetFuga();
}

エラーは「***の命令が***のメモリを参照しようとしました。メモリがreadになることはできませんでした。」
というものです。

環境はVC++6 SP5です。
ちなみに友人にBCCでコンパイルしてもらったところエラーは発生しませんでした。

長々と申し訳ありませんがよろしくお願いします。
914910-912:04/07/02 21:39
ちなみにデバッガで追ったところ

int main(void){
hogehoge* pHogehoge = new hogehoge;
  pHogehoge->SetFuga();  // ←
}

の部分でエラーが発生しているようです。
>>913

>>903-はすでに見させていただきましたが、
それとは違うと思うのですが…。
もちろんリビルドなどは行いました。
    pFuga->SetHoge(new hoge);

pFugaのインスタンス作ってないのに、メソッドを呼ぶなハゲ。
上のやつもそうだが、VCに問題があるような書き方するな
こんなレベルじゃ、たとえ糞コンパイラ使っていてもコンパイラを疑う資格すらない。
917910-912:04/07/02 22:10
>>916
ああああ、申し訳ない

プロジェクトから簡略化して切り出したときに入れ忘れてました。
ということでそのファイルは無事実行できました。BCCは単に運よかっただけみたいですね。

ということはこれはプロジェクト自体のエラーの原因ではなかったみたいです。

本当に申し訳ありません。
BCCのうんこっぷりが証明されました
919デフォルトの名無しさん:04/07/02 23:45
CDプレイヤーを作りたいんですが、どうしたらいいんでしょうか?
もう国内に工場ないと思うよ
921919:04/07/02 23:50
いや、機械じゃなくて、ソフトです。
ミツミは国内に工場あるんでねーの?
MCI_SETでmciSendCommandの第3引数にMCI_SET_DOOR_OPENを渡してみたらどうでしょう。
924デフォルトの名無しさん:04/07/03 00:26
Visual C++ .NETを使っています。
学校ではVisual C++ 6.0を使っているので、そちら用の参考書
(3週間マスターVisual C++6.0,日経BP社)を借りて勉強していたのですが、
C++ .NETにはClass Wizardがないので「Class Wizardを使って、CTimersDlgクラスに、
WM_TIMERメッセージに対応する為の関数OnTimerを追加する」という所で詰まってしまいました。
クラスビューでCTimersDlgを右クリックして追加から関数の追加を選択し、戻り値の型voidと、
UINT(Unsigned int?)型のパラメータnIDEventを追加して、参考書通りのコードを追加したのですが、
思い通り(時刻を取得し書式を整えてダイアログに表示する)の動作をしません。
考えてみればWM_TIMERメッセージに対応させる操作が抜けているので当たり前だとは思ったのですが、
解決法が思いつきません。
どのようにすればいいのでしょうか?
>923

ありがとう御座います。
やってみます。
>>924
1.リソースからダイアログの編集画面を出す(絵になっててボタンとかくっつけていくやつ)
2.ダイアログ上で右クリックし「プロパティ」
3.「プロパティ」のビューにある「メッセージ」というボタンを押す
>>924
クラスビューのCTimersDlgを右クリックして
「Windowsメッセージハンドラの追加」で、左のリストから
WM_TIMER をクリックして「ハンドラの追加」ボタンを押すと
OnTimer関数をオーバーライドしたものが自動で生成される。
後はMSDNで。
928927:04/07/03 00:34
おっと失礼 .NETですか
929924:04/07/03 00:51
>>926
ありがとうございます。
ここのWM_TIMERの右側にOnTimerと追加すればいいんですよね?
でも一度自分で手書きで書いてしまった為か、TimerDlg.cppのOnTime関数は消したのに
「オーバーロードされた関数'OnTime'は既に存在しています」と出てしまいました。
関数を消すだけではダメなのでしょうか…?
930デフォルトの名無しさん:04/07/03 00:51
Visual Basicに対抗してMiserable Basic開発したいんですけど。
931デフォルトの名無しさん:04/07/03 00:53
最近ちょっとVC#をかじってみたが、確かにポトペタ環境は楽ですが
が職業上FA関係のライブラリを使うため、それらのライブラリをイチイチ
DllImportするのは面倒なため、やっぱりとうぶんVC++から離れなれない・・・
932924:04/07/03 01:28
>>929
自己レス
TimerDlg.hの方のOnTimerに関する記述を消せば大丈夫でした。

>>926さん、>>927さん、ありがとうございました。
>>931
VC++もポトペタだがいつの時代から来た人だ?
934デフォルトの名無しさん:04/07/03 01:35
>>933
はぁ?
なに言っての、このボンクラ
>>934
>>933はダイアログアプリしか作ったこと無いんだ。許してやれ。
もしくはVBと勘違いしてんだ。
DllImportするのは面倒なため
>>935
バージョンアップする金も.NETに移行する気もない貧乏はすっこんでろ!
ビットマップをLoadBitmapで読み込むさいに、lpBitmapNameをMAKEINTRESOURCE(IDB_BITMAP1)
のようにしてやろうとしたのですが認識してくれないです。
定義漏れがあるのかと思ってリソースのヘッダファイルも確認するとしっかり定義されてました。
ちなみにIDを文字列にしてやるとできました。
どういう原因が考えられますか?
resource.hでIDを定義してないから文字列扱いにされてる
>>939
> 'IDB_BITMAP1' : 定義されていない識別子です。
メッセージがこうでてるし、文字列ならビットマップは表示されるので
resource.hでIDを定義しわすれてるとしか考えられないのですが、
実際resource.hをひらいて確認するとちゃんと定義されてるんです。
どういうことなんでしょうか・・・。
941940:04/07/03 03:18
あとメニューやダイアログボックスなどのリソースはMAKEINTRESOURCEを使って
読み込めます。
そもそもビルドすれば勝手にresource.hにIDの値定義してくれますよね?
#include "resource.h"
ポトペタってなんですか?教えてエロいひと
ポト ペタ ピッタンコ この世で一匹!
ポトっと落としてペタって貼り付ける
946940:04/07/03 12:23
>>942
(/ω\)ハズカシーィ
インクルードしてませんでした・・・・。はぁ・・。
とりあえずありがとうございました・・・。
ぼっとん便所
なんだなんだ今日はずいぶんとレスついてるな