|
回答ありがとうございます。 では、DNSクライアントとnamedデーモンが、 UDPプロトコルでportの42番でやり取りすると理解してよろしいですね。 すっきりしました。 ありがとうございました。 |
|
はじめまして、gongoと申します。 いきなりで申し訳ありませんが質問があります。 私はXアプリケーションの勉強を始めたばかりなのですが XライブラリとXツールキットを用いたプログラムを書こうとして 行き詰まってしまいました。 と言いますのは、例えばXツールキットを用いて表示させた窓に Xライブラリを用いて直線を引いたりする方法がわかりません。 XDrawLine(XtDisplay(w),XtWindow(w),gc,x1,y1,x2,y2); といった感じでプログラムの中に書き込みますとコンパイルは できるのですが、実行させるときにXDrawLineのところで Segmentation faultで止まってしまいます。 本もいろいろと読みましたがどうにもうまくいきません。 作成途中のプログラムは以下のところにあります。 http://www.din.or.jp/~gongo/xtshirt.c(本体) http://www.din.or.jp/~gongo/color.dat(色の数値) どうか宜しくお願い致します。 |
|
> では、DNSクライアントとnamedデーモンが、 > UDPプロトコルでportの42番でやり取りすると理解してよろしいですね。 その通りです。 > 例えばXツールキットを用いて表示させた窓に > Xライブラリを用いて直線を引いたりする方法がわかりません。 非常に興味のある分野なので答えたいのはやまやまなのですが、 Xt を触ったことがないのでわかりません。でも、DrawLineOnWidget 内で drawgc を使ってますが、DrawLineOnWidget を呼び出す前に drawgc に GC をセットし忘れているように見えます。 あと、戻り値を見ると XtWindow(w) で NULL が返ってるのが 問題…なのかなぁ。解決法がわかったら教えて下さい。 |
|
> 非常に興味のある分野なので答えたいのはやまやまなのですが、 素早いご返答ありがとうございます。 > drawgc を使ってますが、DrawLineOnWidget を呼び出す前に > drawgc に GC をセットし忘れているように見えます。 本によると、ウィジェットをリアライズした後にGCを 設定するようなことがかいてありましたもので XtRealizeWidget(toplevel); よりも後にdrawgcをセットすることにしたのです。 もう少し調べてみます。 > あと、戻り値を見ると XtWindow(w) で NULL が返ってるのが すみません、これはどういうことなのでしょうか。 NULLが返ってくるというのはどのように調べたらよろしいのでしょうか。 NULLが返ってるとなるとおそらくここが悪いのだと思います。 う〜ん、もう少し調べてみます。 |
|
> XtRealizeWidget(toplevel); > よりも後にdrawgcをセットすることにしたのです。 うーん、XDrawLine を呼んだ時点で X サーバとの通信が 行われると思うんで、やっぱりセットしておかないと いけないんじゃないかなぁ…。GC は typedef struct _XGC * GC; なので、GC の中身がゴミ (初期化してないので) だと まずいと思うのです。 > NULLが返ってくるというのはどのように調べたらよろしいのでしょうか。 printf("%d\n",XtWindow(w)) としました。他の部分で同じことを すると何か値が入っているのですが、XDrawLine の前で表示させると 0 となってしまうので、XtWindow がこけてるのかと思いました。 まぁ、知識がないのに推測を重ねるのもアレなので、 会社にある本を読んで調べてみます。 |
|
> 他の部分で同じことをすると何か値が入っているのですが、 > XDrawLine の前で表示させると 0 となってしまうので、 > XtWindow がこけてるのかと思いました。 例えばDrawLineOnWidget(label)の書いてあった手前に printf("XtDisplay(label) = %d\n",XtDisplay(label)); printf("XtWindow(label) = %d\n",XtWindow(label)); と書いたところ、XDrawLine の前で表示させるのと同様に 次のようになってしまいました。 XtDisplay(label) = 67584 XtWindow(label) = 0 やはり0というのはまずいのでしょうか。labelを使い回して いくつかの窓を表示させようとしているのがまずいのか・・・。 あとdrawgcのセットをDrawLineOnWidget(w)の中で下記のように 行ってみたところ、 drawgc=XCreateGC(XtDisplay(w),XtWindow(w),0,NULL); XSetForeground(XtDisplay(w),drawgc,pixel[1]); XSetBackground(XtDisplay(w),drawgc,pixel[0]); DrawLineOnWidget(label)は抜け出て、ok6までは到達したのですが X Error of failed request: BadDrawable (invalid Pixmap or Window parameter) Major opcode of failed request: 55 (X_CreateGC) Resource id in failed request: 0x0 Serial number of failed request: 35 Current serial number in output stream: 48 となってしまいました。 お手数お掛け致しまして申し訳ございません。 |