みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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);

投稿日時 - 2017-07-19 23:00:23

QNo.9353712

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

そんなに特殊な事ではないと思いますが、

>>基本的には w の値はマジックナンバーとして扱うのが前提です。
>どういうことかちょっとわかりません。

ライブラリ内に閉じた使いかたをしましょうということです。何故なら

>> 現実としては grep してみると unsigned int (%u) か unsigned long (%lu) になりそうですが、OS や CPU アーキテクチャ、コンパイラにより違うので、

移植性やコードの見通しも悪くなるでしょうし、それに加えてライブラリ側の変更で、コンパイルエラーやコアダンプしてみたりバグの原因にもなりやすいからです。

もちろん例外はあるし、対応箇所がコード中に散らばらないよう工夫したりすれば、その限りではありません。

投稿日時 - 2017-07-22 10:44:42

お礼

回答有難うございます。

投稿日時 - 2017-07-23 15:59:27

ANo.1

X11 というか C のお話で、%d は int を要求するけど、w は Window だよという警告です。基本的には w の値はマジックナンバーとして扱うのが前提です。

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

投稿日時 - 2017-07-20 16:14:43

補足

>基本的には w の値はマジックナンバーとして扱うのが前提です。
どういうことかちょっとわかりません。

unsigned long (%lu)で w の値を表示させることができました。
ありがとうございます。

投稿日時 - 2017-07-20 23:13:42

お礼

回答有難うございます。

投稿日時 - 2017-07-20 23:14:07

あなたにオススメの質問