環境WindowsXp,VC6.0 C言語ソース(既存のものを利用中 元はSGI/WSで動作)
右ボタンメニュの
if (qtest() || !attached)
{
switch (qread(&value))
{
case MENUBUTTON:
if (value == 1) menval=dopup(mainmenu); /* right mouse button is pressed */
switch (menval)
{
case 1:
movzoom();
break;
で選択した 次のサブルーチンでプログラムが”応答なし”になります。
void movzoom(void){
static int dx, dy, odx, ody, tdx,tdy,otdx,otdy;
odx= getvaluator(MOUSEX); ody= getvaluator(MOUSEY);
printf("2011 getvaluator(MOUSEX) (MOUSEY) odx==%d ody=%d\n",odx,ody);/*このPrint表示でここまでは動作することを確認*/
while(TRUE){
while( qtest() || !attached ){
devd= qread(&value);
if( devd==INPUTCHANGE) attached=value;
else if( devd==MENUBUTTON && value==0 ){ qreset(); return; }
} /* end while(qtest) */
/* w_axis();set graph axis onto w_view(), x1right, y1lower, x2left, y2upper*/
dx=getvaluator(MOUSEX); tdx=tdx+(dx-odx); odx=dx;
以下マウス位置数値を取得、変数を得る
}
上の while(TRUE){ 以下に問題があるようですが、どのようにしたら
マウス値をえることができるでしょうか?
while(TRUE){
の行にブレークポイントを設定して、デバッグ実行を開始して
当該機能を実行してみてください。ブレークポイントで、
停止したらステップ実行して、各変数の内容をウォッチに
登録して何が起こっているか見てみましょう。
いちいちprintf()等でチェックライトを入れる必要はないはずですね。
ありがとうございます
多分
while( qtest() || !attached ){ }
の中で問題があるのでしょう。
助言の
”の行にブレークポイントを設定して、”
は VC6では メニューでBPの挿入で 赤丸点が出て 確認できました
"デバッグ実行を開始して"
はビルドの中で 選択しました。
すると 実行されます。
”当該機能を実行してみてください。ブレークポイントで、
停止したらステップ実行して、”
は 土このメニューにあるのでしょうか?
ステップインが灰色文字です
”各変数の内容をウォッチに
登録して何が起こっているか見てみましょう。”
は 表示のデバッグウインドウでしょうか これも灰色です。
”いちいちprintf()等でチェックライトを入れる”
はい、debugの方法を知らないもので この方法を使っていました。
このソースはSGI/WSでのsgl.libを使用したときのもので 現在Windows機で glut.h や glut32.dllを使用しています。
while( qtest() || !attached ){ /* checks the contents of the event*/
devd= qread(&value);
if( devd==INPUTCHANGE) attached=value; *reads the first entry in the event queue*/
else if( devd==MENUBUTTON && value==0 ){ qreset(); return; }
} /* end while(qtest) */
}
内の各関数との関係が定かではないのですが、
linkしている他のソースには下の記述があります。
int qread(int *value)
{
*value = 0;
if (qin != qout)
{
int type = events[qout][0];
*value = events[qout++][1];
if (qout >= QSIZE) qout = 0;
return type;
}
return 0;
}
多分 sglとの整合を取っていると思われます。
ここで sglとは独立に
同様な 推測するに カーソルがWindowから離れずに、Key/Maouse等が押されて、変化したら Whileを抜けて、Menu右ボタンがおされたら、この関数を抜けるReturn;するとしている こともよくわからないが そのような
典型的な関数はありませんか?
ツイート | ![]() |