アクセス違反の原因が分からない。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Ma

アクセス違反の原因が分からない。

#1

投稿記事 by Ma » 15年前

お世話になってます。

「複雑な形を3D描画」と似た内容なのですが、そのスレが長文化してしまったのと
質問内容がちょっとかわるので、新しいスレで失礼します。
経緯を知りたい場合は、お手数おかけしますが、「複雑な形を3D描画」を参照お願いします。

添付ファイルに、中が抜けている柱を3Dで描画することができるクラスが含まれているテキストファイルがはいってます。

使い方は簡単で


hollowCylinder temp;
temp.makeNew(3,0,1,2,1,2,1,true,true);
temp.draw();

こんな感じです。

どうも描画するときにアクセス違反が起こるみたいで、その原因がわかりません。
VC++使っているので、デバッガー使って値をチェックしようと思ったんですが、
new を使ってメモリ確保したデータなので中身を見ることができません・・・orz
(↑仕様なのでしょうか?)
値をチェックする場合は

for(int i = 0; i < divN*2;i++){
printfDx("%d{%4.2f,%4.2f,%4.2f} // ",i,VertexInner.pos.x,VertexInner.pos.y,VertexInner.pos.z);
}
for(int i = 0; i < divN*6;i++){
printfDx("{%d,%d} // ",i,Index);
}
これでチェックできます。 画像

Ma

Re:アクセス違反の原因が分からない。

#2

投稿記事 by Ma » 15年前

自己解決でした、すいません。
なぜかよくわかりませんが、頂点を求める計算をちょっと変えたら解決しました。
修正後↓

//底2 = 底1 と pos.x 成分修正(x方向のシフト)
VertexEnd[i*2].pos = VGet(xEnd*100,100*rE*sin(-theta),100*rE*cos(-theta));//底2、内側
VertexEnd[i*2+1].pos = VGet(xEnd*100,100*RE*sin(-theta),100*RE*cos(-theta));//底2、外側

//側面は、底の頂点のコンビネーション。
VertexInner[i*2].pos = VGet( xStart*100, sin(-theta)*rS*100, cos(-theta)*rS*100 );//内側側面、底1
VertexInner[i*2+1].pos = VGet(xEnd*100,100*rE*sin(-theta),100*rE*cos(-theta));//内側側面、底2
VertexOuter[i*2].pos = VGet( xStart*100, sin(theta)*RS*100, cos(theta)*RS*100);//外側側面、底1

Ma

Re:アクセス違反の原因が分からない。

#3

投稿記事 by Ma » 15年前

すいません、気のせいでした。(1回うまくいったのになぁ・・・)
↑の修正後もアクセス違反が発生してました。



修正追記
管理人様すいません、パス間違えたみたいなので解決をはずしてもらえませんか? 画像

Ma

Re:アクセス違反の原因が分からない。

#4

投稿記事 by Ma » 15年前

何度か実験していたところ、アクセス違反が出る条件がようやくわかってきました。(半日使ってしまったorz)
どうやら、一度に作れる個数に制限があるみたいなんです。


つまり、makeNewの第一引数の数と作る角柱の数次第ということでした。

じゃー、newが失敗しているんじゃないかと思って try catch 文で例外をみつけようと思ったんですが
例外処理にひっかからないのでどうも違うみたいです。

自力じゃ見つからないっぽいので、プログラミングの先輩方(みなさん)に頼らせてください(泣


同じ内容の事の話を(複雑な3D図形)のスレに移ってる傾向がありますが、投稿があれば責任もってこちらもしっかりチェックしますのでご了承ください。 画像

閉鎖

“C言語何でも質問掲示板” へ戻る