トップページ > 過去ログ > 記事閲覧
異常終了
名前:さかな 日時: 2009/10/17 14:56

たびたびすいません、助けてください。 以下のプログラム(妙な物体を表示するだけ)を実行すると、 ウィンドウを閉じた後に「異常終了」のダイアログが出ます。 ログを見ても異常はないようです。 浮動小数点のあたりに問題があるような気がするのですが、自分ではわかりません。 (point[z*100+x+50].pos=の行をコメントアウトすると直ります) #include "DxLib.h" #include <math> #define PROP 100.0f #define CALC cos( ((float)x) /90.0f *PHI_F) *cos((((float)z)-50.0f)/90.0f*PHI_F) *PROP void MouseInput(); int WINAPI WinMain(HINSTANCE hI,HINSTANCE hP,LPSTR lpC,int nC){ ChangeWindowMode(true); //ウィンドウモード SetOutApplicationLogValidFlag(true); //ログ出力ON if(DxLib_Init()==-1) return -1; VERTEX3D point[10000]; //座標 int x,y,z; for(z=0;z<100;z++){ for(x=-50;x<=50;x++){ point[z*100+x+50].dif=GetColorU8(0,z*2.5,255-z*2.5,255); point[z*100+x+50].spc=GetColorU8(0,255-z*2.5,z*2.5,255); point[z*100+x+50].u=0; point[z*100+x+50].v=0; point[z*100+x+50].norm=VGet(0.0f,0.0f,-1.0f); point[z*100+x+50].pos=VGet((float)x*3,(float)CALC,(float)z*3); } } unsigned short indc[60000]; //頂点インデックス for(int z=0;z<99;z++){ for(int i=0;i<100;i++){ indc[i*6+z*594]=100*z+i; indc[i*6+z*594+1]=100*z+i+1; indc[i*6+z*594+2]=100*z+i+100; indc[i*6+z*594+3]=100*z+i+100; indc[i*6+z*594+4]=100*z+i+101; indc[i*6+z*594+5]=100*z+i+1; } } SetCameraNearFar(1.0f,300.0f); SetCameraPositionAndTarget_UpVecY(VGet(0.0f,50.0f,-50.0f),VGet(0.0f,0.0f,0.0f)); SetDrawScreen(DX_SCREEN_BACK); while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){ ClsDrawScreen(); MouseInput(); DrawPolygonIndexed3D(point,10000,indc,19602,DX_NONE_GRAPH,false); ScreenFlip(); } DxLib_End(); return 0; } int px,py; float xzd,yd; void MouseInput(){ int x,y; GetMousePoint(&x,&y); int dx,dy; dx=x-px; dy=y-py; yd+=((float)dx)/100.0f; xzd+=((float)dy)/100.0f; VECTOR campos; campos.x=-cos(yd)*200.0f; campos.z=-sin(yd)*200.0f; campos.y=200.0f; SetCameraPositionAndTarget_UpVecY(campos,VGet(0.0f,0.0f,0.0f)); px=x; py=y; } 環境:CPU Celeron D 2.66G DRAM 512MB OS WinXP SP3 DirectX9.00cエンドユーザーランタイムインストール済み DXライブラリV3.00c どなたかご指摘お願いしますm(_ _)m

Page: 1 |

Re: 異常終了 ( No.1 )
名前:かたぱると 日時:2009/10/17 17:09

とりあえず VERTEX3D point[10000]; //座標 int x,y,z; for(z=0;z<100;z++){ for(x=-50;x<=50;x++){ point[z*100+x+50].〜 } } このループだと最終ループで point[10000] にアクセスしていると思うのですが。 この場合pointのindexは0オリジンだから0〜9999ですよね。
Re: 異常終了 ( No.2 )
名前:Masao 日時:2009/10/17 18:26

マクロで使われている #define CALC cos( ((float)x) /90.0f *PHI_F) *cos((((float)z)-50.0f)/90.0f*PHI_F) *PROP の、PHI_F の宣言がどこにも見当たりませんが、これでコンパイル通るものなんでしょうか…。 私が間違ってそうですね^^;
Re: 異常終了 ( No.3 )
名前:さかな 日時:2009/10/18 07:43

ご指摘のとおりでした(^ ^);; x<=50の不等号を見落としていたみたいです。 point[10001]に変えるとうまく動きました。 ありがとうございます。
Re: 異常終了 ( No.4 )
名前:さかな 日時:2009/10/18 07:51

あ、それからちなみに、 PHI_Fについては、私も存在を知らなかったのですが、 関数リファレンスのSetCameraPositionAndAngleの項で使われているので使ってみただけです。 某BASICみたいにPIでは通らなかったので...
Re: 異常終了 ( No.5 )
名前:管理人 日時:2009/10/18 12:17

PHI_F は DxLib.h に定義してあります PI だと定義が重複しそうだなと思って・・・ ちなみに double 版も含めて4つ定義してあります #define PHI (3.1415926535897932384626433832795 ) #define PHI_F (3.1415926535897932384626433832795f) #define TWO_PHI (3.1415926535897932384626433832795 * 2.0 ) #define TWO_PHI_F (3.1415926535897932384626433832795f * 2.0f)

Page: 1 |