1

Visual Studio Express 2010 で C++ を使用して OpenGl プログラムをコーディングしているときに、奇妙な問題が発生しました。
私が使用するもの: Windows 7 64 ビット、OpenGl 4.x
私のパートナーが使用するもの: Windows XP 32 ビット、Visual Studio Express 2010、OpenGl 2.x

今までは、モデルの頂点を描いただけで、両方のシステムで問題なく動作しました (非推奨ですが、まだ初心者です)。現在、彼は 3D メッシュをインポートしてアニメーションを作成するためのライブラリを含めています。彼にとってはすべてうまくいきますが、私は得ます

Ant Simulation.exe の 0x0055f838 での初回例外: 0xC0000005: アクセス違反の読み取り場所 0x00bb0000。
Ant Simulation.exe の 0x0055f838 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00bb0000。

デバッガーを使用して、問題を次の行まで追跡しました

glDrawArrays(GL_QUADS,0,n_data);

コードをキャッチしようとしましたが、何もトリガーされません。奇妙なことに、昨日はデバッガーがクラッシュするまでこの行を2〜3回調べることができましたが、今日は直接クラッシュします。昨日、n_dataが毎回同じであることを確認しました。Windows で *.exe を実行すると、クラッシュします (以下のエラー コード)。パートナーから *.exe が送られてきても、通常は動作しませんが、一度起動できました。他のウィンドウでエラーを再現しました。Linux 64bit で試してみましたが、問題ありません。互換モードで実行してみましたが、問題は変わりません (まだクラッシュします)。

私は周りを検索して、これを見つけました
: -form-or-wpf-application.aspx?Redirected=true

これを正しく理解したかどうかはわかりません。キャッチできない例外がありますが、これはアプリケーションを強制終了します - しかし、他のシステムがこの例外に問題を抱えていないのはなぜですか?

リンクに記載されている方法で解決しようとしましたが、VS Express には初回例外をスローするメニューがないようです。私はVS 2012を入手しようとしますが、それでも知りたいのですが、これは完全にWindowsの問題ですか、それともコードの問題によってクラッシュが発生する可能性がありますか(リンクのコメントの1つで提案されているように)? また、実際に何が起こっているのかについての説明もいただければ幸いです...

*.exe を実行すると、次のエラーが表示されます。

問題イベント名: APPCRASH

アプリケーション名: Ant Simulation.exe
アプリケーション バージョン: 0.0.0.0

アプリケーション タイムスタンプ: 511d99a3

障害モジュール名: StackHash_0a9e

障害モジュール バージョン: 0.0.0.0
障害モジュール タイムスタンプ: 00000000

例外コード: c0000005

例外オフセット: 0037f278

OS バージョン: 6.1.7601.2.1.0.256.48

ロケール ID: 1031

追加情報 1: 0a9e

追加情報 2: 0a9e372d3b4ad19135b953a78882e789

追加情報 3: 0a9e

追加情報 4: 0a9e372d3b4ad19135b953a78882e789

4

1 に答える 1

4

Windows の「最初の例外」は C++ の例外ではありません。これは、ランタイム システムが、無効なポインターの逆参照など、プログラムの不正な動作を検出したことを意味します。実際、「アクセス違反の読み取り場所 0x00bb0000」は、これが起こっていることを非常に示唆しています。

無効なポインターを逆参照しても、異なるシステムで、または同じマシンでの異なる実行でさえ、必ずしも同じ動作が発生するとは限りません。詳細については、Windows では C コードがクラッシュするが、Linux ではクラッシュしないなどの質問を参照してください。この場合、障害は GL 実装内で発生しているように見えますが、これはおそらく以前のアプリケーション コードが悪い情報を提供したことが原因です。

有効なすべての頂点配列に少なくともn_data要素があることを確認してください。n_data - 1(それらが要素だけを持っていないこと、およびそれが予期した値を保持していることを特に注意してくださいn_data。) 以前に GL 関数に渡したポインターが有効であることも確認する必要があります。チェックするGLの状態は他にもたくさんありますが、それが私の最初の推測です。

于 2013-02-15T14:51:37.737 に答える