创建位图时避免警告信息。

3
这是我第一次提出SO问题,请温柔点。 :)
我不是一个程序专家。我有一个正在使用的程序,它带有一些BMP文件。我仍然有这些BMP文件,但我正在将它们转换为C代码。目前,我是这样加载它们的:
static char bits[] = {
0xff,0xff,0xff,0xff,0xff,0xab,0xaa,0x5a,0x55,0xd5,0x55,0x55,0xb5,0xaa,0xaa,
0xab,0xaa,0x5a,0x55,0xd5,0x55,0x55,0xb5,0xaa,0xaa,0xab,0xaa,0x5a,0x55,0xd5,
[blah blah blah]
0xff,0xff,0xff,0xff,0xff};
walls.pixmap = XCreateBitmapFromData(dpy,DefaultRootWindow(dpy),bits,40,40);

所有大于0x80的字符都会产生此警告:

bitmaps.c:38: warning: overflow in implicit constant conversion

因此,我尝试将我的定义更改为

static unsigned char bits[] = {

但是这会显示一个新的警告:

bitmaps.c:31: warning: pointer targets in passing argument 3 of 'XCreateBitmapFromData' differ in signedness
/usr/include/X11/Xlib.h:1607: note: expected 'const char *' but argument is of type 'unsigned char *'

有没有一种方法可以加载位图而不会产生警告?我应该接受警告总是会出现这一事实吗?既然我已经拥有了原始的BMP文件,那我是否应该做些不同的事情呢?

谢谢。

1个回答

1

使用无符号字符应该可以避免警告。

有符号字符实际上不能表示文字(它们的类型为int,而不是char)。

static unsigned char bits[] = {
    0xff,0xff,0xff,0xff,0xff,0xab,0xaa,0x5a,0x55,0xd5,0x55,0x55,0xb5,0xaa,0xaa,
    0xab,0xaa,0x5a,0x55,0xd5,0x55,0x55,0xb5,0xaa,0xaa,0xab,0xaa,0x5a,0x55,0xd5,
    /* [blah blah blah] */
    0xff,0xff,0xff,0xff,0xff};

walls.pixmap = XCreateBitmapFromData(dpy,DefaultRootWindow(dpy),(char*) bits,40,40);

换句话说,您也可以显式地转换每个文字。
static char bits[] = {
    (char)0xff,(char)0xff,(char)0xff,(char)0xff,(char)0xff,(char)0xab,(char)0xaa,(char)0x5a,(char)0x55,(char)0xd5,(char)0x55,(char)0x55,(char)0xb5,(char)0xaa,(char)0xaa,
    (char)0xab,(char)0xaa,(char)0x5a,(char)0x55,(char)0xd5,(char)0x55,(char)0x55,(char)0xb5,(char)0xaa,(char)0xaa,(char)0xab,(char)0xaa,(char)0x5a,(char)0x55,(char)0xd5,
    /* [blah blah blah] */
    (char)0xff,(char)0xff,(char)0xff,(char)0xff,(char)0xff};

但对我来说,那似乎有点尴尬。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接