• 締切済み

X11に関して質問です。ウィンドウIDの表示。

/* ウィンドウIDを表示 */ printf("%d\n", w); の部分でウィンドウID(XCreateSimpleWindow関数が返す値)を表示したいのですがエラーが出ます。 表示するにはどうすればよいでしょうか? #include <X11/Xlib.h> #include <X11/Xutil.h> #include <stdio.h> #include <stdlib.h> int main() { Display *display; Window w; /* ディスプレイ・サーバに接続 */ display = XOpenDisplay(NULL); if(display == NULL){ fprintf(stderr, "Cannot open display.\n"); exit(1); } /* ウィンドウを生成 */ w = XCreateSimpleWindow(display, DefaultRootWindow(display), 50, 50, 400, 300, 1, BlackPixel(display, 0), WhitePixel(display, 0)); /* ウィンドウIDを表示 */ printf("%d\n", w); return 0; } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー エラー内容 ウィンドウ生成要求.c: In function ‘main’: ウィンドウ生成要求.c:24:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘Window’ [-Wformat=] printf("%d\n", w);

みんなの回答

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

そんなに特殊な事ではないと思いますが、 >>基本的には w の値はマジックナンバーとして扱うのが前提です。 >どういうことかちょっとわかりません。 ライブラリ内に閉じた使いかたをしましょうということです。何故なら >> 現実としては grep してみると unsigned int (%u) か unsigned long (%lu) になりそうですが、OS や CPU アーキテクチャ、コンパイラにより違うので、 移植性やコードの見通しも悪くなるでしょうし、それに加えてライブラリ側の変更で、コンパイルエラーやコアダンプしてみたりバグの原因にもなりやすいからです。 もちろん例外はあるし、対応箇所がコード中に散らばらないよう工夫したりすれば、その限りではありません。

purogu2017
質問者

お礼

回答有難うございます。

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

X11 というか C のお話で、%d は int を要求するけど、w は Window だよという警告です。基本的には w の値はマジックナンバーとして扱うのが前提です。 デバックなどで一時的に値を見たいなら、X11 のヘッダから Window の定義を調べて、それに見合う変換指定をしなければなりません。現実としては grep してみると unsigned int (%u) か unsigned long (%lu) になりそうですが、OS や CPU アーキテクチャ、コンパイラにより違うので、御自分の環境で調べてください。

purogu2017
質問者

お礼

回答有難うございます。

purogu2017
質問者

補足

>基本的には w の値はマジックナンバーとして扱うのが前提です。 どういうことかちょっとわかりません。 unsigned long (%lu)で w の値を表示させることができました。 ありがとうございます。

関連するQ&A

  • X11に関して質問です。ウィンドウの属性の情報。

    ウィンドウの属性の情報を知るプログラムを教えてください。 参考ページ:http://xjman.dsl.gr.jp/man/man3/XGetWindowAttributes.3x.html XGetWindowAttributes関数の使い方がよくわかりません。 XWindowAttributes構造体の一つ目のメンバの値を端末に表示するにはどうすればいいでしょうか? #include <X11/Xlib.h> #include <X11/Xutil.h> #include <stdio.h> #include <stdlib.h> int main() { Display *display; Window w; GC gc; XEvent event; XWindowAttributes *window_attributes_return; /* ディスプレイ・サーバに接続 */ display = XOpenDisplay(NULL); if(display == NULL){ fprintf(stderr, "Cannot open display.\n"); exit(1); } /* ウィンドウを生成 */ w = XCreateSimpleWindow(display, DefaultRootWindow(display), 50, 50, 400, 300, 1, BlackPixel(display, 0), WhitePixel(display, 0)); XSelectInput(display, w, ExposureMask); XMapWindow(display, w); /* GCの生成 */ gc = XCreateGC(display, w, 0, 0); /* リクエスト送信 */ XFlush(display); /* イベントループ */ while(1){ XNextEvent(display, &event); switch(event.type){ case Expose: XDrawLine(display, w, gc, 0, 0, 300, 300); /* ウィンドウの属性の情報を知る?? */ XGetWindowAttributes(display, w, window_attributes_return); printf("%d", window_attributes_return.x); break; } } /* Xサーバとの接続を解除 */ XCloseDisplay(display); return 0; }

  • Xlibでウィンドウを作る

    https://ja.wikipedia.org/wiki/Xlibに載っているプログラムで質問です。 ただウィンドウを表示させたい場合に /*イベントループ*/ の部分は必要なのでしょうか? この部分をなくすとウィンドウが表示されません。 イベントループがなくてもウィンドウを表示させることはできますか? /* ウィンドウに四角形を描画する簡単な Xlib アプリケーション */ #include <X11/Xlib.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { Display *d; int s; Window w; XEvent e; /* サーバとのコネクションを開く */ d=XOpenDisplay(NULL); if(d==NULL) { printf("Cannot open display\n"); exit(1); } s=DefaultScreen(d); /* ウィンドウ生成 */ w=XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1, BlackPixel(d, s), WhitePixel(d, s)); /* 受け付けるイベントの種類を選択 */ XSelectInput(d, w, ExposureMask | KeyPressMask); /* ウィンドウを可視化 */ XMapWindow(d, w); /* イベントループ */ while(1) { XNextEvent(d, &e); /* ウィンドウの描画と再描画 */ if(e.type==Expose) { XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10); XDrawString(d, w, DefaultGC(d, s), 50, 50, "Hello, World!",strlen("Hello, World!")); } /* キー押下で終了 */ if(e.type==KeyPress) break; } /* サーバとのコネクションを閉じる */ XCloseDisplay(d); return 0; }

  • 結果の表示

    よろしくお願いします。 プログラミングの勉強をしています。 座標上にx1、x2、y1、y2をとり、この2点間の距離が表示されるプログラムを作っています。 最終的には自分で座標を入力し、以下のように表示されることが目標です。 x1:0 y1:0 x2:1 y2:1 この2点間の距離は1.414214です。 次のように作ってみましたが、1.414・・・となるところが、0.0000・・・となってしまいます。どこを直したらよいでしょうか、お願いいたします。 #include <stdio.h> #include <math.h> main() { int x1 = 0, y1 = 0, x2 = 0, y2 = 0; double A = 0.0, dx = 0.0, dy = 0.0; A = sqrt(dx * dx + dy * dy); dx = x1-x2; dy = y1-y2; printf("x1:"); scanf("%d",&x1); printf("y1:"); scanf("%d",&y1); printf("x2:"); scanf("%d",&x2); printf("y2:"); scanf("%d",&y2); printf("この2点間の距離は%lfです\n", A); }

  • お願いします。

    0から9までの数字を入力しあたりかはずれかを表示するプログラム。 #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void){ int r,a; printf("0から9までの数字を入力してください。\n"); scanf("%d",&a); srandom(time(NULL)); r = random()%10; printf("%d \n",r); if(a==r){ printf("アタリ\n");} else{ printf("ハズレ\n");} return 0; }

  • なぜに0が表示されるの?

    キー入力を調べるために以下の プログラムを作成したのですが・・・ #include <stdio.h> #include <stdlib.h> #include <conio.h> int main(void) { int inkey = 0; while (1) { inkey = getch(); if (inkey == 0x1b) { break; } printf("%d %x\n", inkey); } } ↑↓→←とかのキーは、 変数inkeyの値を表示する前に、 0 0と表示されます。 なぜなんでしょうか? ほかのキーでは、普通に表示されます。 教えてください。

  • 解説お願いします。

    0から9までの数字を入力しあたりかはずれかを表示するプログラム。 #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void){ int r,a; printf("0から9までの数字を入力してください。\n"); scanf("%d",&a); srandom(time(NULL)); r = random()%10; printf("%d \n",r); if(a==r){ printf("アタリ\n");} else{ printf("ハズレ\n");} return 0; } 例えば%10は何のためにあるのかとか・・

  • 虚数解の表示

    Ax^2+Bx+Cの形の二次関数の解を計算するプログラムです #include <stdio.h> #include <math.h> int main(void) { double a,b,c,d,x1,x2,real,image; printf("A="); scanf("%lf",&a); printf("B="); scanf("%lf",&b); printf("C="); scanf("%lf",&c); if(a==0){x1=-c/b; printf("X=%5.2lf\n",x1); } if(a!=0.0){d=sqrt(pow(b,2.0)-4*a*c); if(d<0.0){ real=(-b)/(2*a); image=sqrt(-d)/(2*a); printf("実数=%5.2lf\n",real); printf("虚数=±%lfi\n",image);} else if(fabs(d)<0.0){ x1=(-b)/(2*a); printf("X=%5.2lf\n",x1);} else if(d>0.0){ x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); printf("X1=%5.2lf\n",x1); printf("X2=%5.2lf\n",x2);} } return 0;} 判別式d<0、d>0、d=0で分けています 判別式dが負になるとき(虚数解の部分)はそのままではsqrtが使えないので、-dを入れてみたのですがうまくいきません どのように修正すればよいのかご教示願います よろしくお願いします

  • プログラミング

    ランダムの数値を入力してその数値より大きければ正解より大きいと表示して小さければ小さいと表示し正解なら正解ともだすプログラムをつくっています 正解まで何回かかったかとも表示したいと思います 上手く実行できないのでご教授ください #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void){ int i,x,y; srand((unsigned int)time(NULL)); printf("%\n",i); i=rand()%100; //0以上100以下の整数を生成 y=0; printf("1以上100以下の整数を入力してください。\n"); scanf( "%d", &x ); /* 数値を入力させる */ printf("1以上100以下の整数を入力してください。\n"); y=y+1; if( x == i ) { printf("%d回目で当たりました。\n",y); printf("%d回目で当たりました。\n",y); break; /* 無限ループ */ } else{ if ( x < i ) //printf("正解より大きいです。\n"); printf("正解より大きいです。\n"); else //printf("正解より小さいです。\n"); printf("正解より小さいです。\n"); } } //return0;

  • ディスクの空き容量を得たい

    現在ディスクの空き容量を得るプログラムを書いている のですが #include <windows.h> #include <stdio.h> void main() { ULARGE_INTEGER h1; ULARGE_INTEGER h2; ULARGE_INTEGER h3; GetDiskFreeSpaceEx( NULL, &h1, &h2, &h3 ); printf( "h1.QuadPart: %d\n", h1.QuadPart ); } としたところ 画像のようにプラスの値が表示できないのです printf の引数の %d でULARGE_INTEGER の値を表示 できるのでしょうか? それともどこかが間違ってるのでしょうか?

  • C++でのプログラムについての質問です

    このような二次関数の解を求めるプログラムを作成したのですが、自作関数solveをvoid solve(double, double, double)のように変更し同じ動作をするように変更したいです どのようにへんこうすればよいでしょうか #include<stdio.h> #include<stdlib.h> #include<math.h> int main(void) { double a, b, c; /*二次方程式の定数*/ double D, x1, x2, r1, r2; printf("ax^2 + bx + c = 0 の係数 a, b, c を入力してください---> \n"); scanf_s("%lf %lf %lf", &a, &b, &c); printf("2次方程式を解いた結果は次の通りとなる。\n"); if (a == 0.0) { if (b == 0.0) { printf("係数がおかしい\n"); exit(-1); } { x1 = -c / b; printf("解は%f です。\n", x1); exit(0); } } else { D = b * b - 4 * a * c; if (D >= 0) { x1 = (-b + sqrt(D)) / (2.0 * a); x2 = (-b - sqrt(D)) / (2.0 * a); if (D == 0.0) { printf("解は %f です。\n", x1); } else { printf("解は %f と %f です。¥n", x1, x2); } } else { r1 = -b / (2 * a); r2 = sqrt(-D) / (2 * a); printf("解は%.2f+%.2fi と%.2f-%.2fi \n", r1, r2, r1, r2); } } return 0; }