看到c专家编程上面有一个有意思的东西

171页那里,有一段描述是这样的:

根据位模式构建图形图标(icon)或者图形(glyph),是一种小型的位模式映射于屏幕产生的图像。一个位代表图像上的一个像素。如果一个位被设置,那么它所代表的像素就是“亮”的。如果一个位被清除,那么它所代表的像素就是“暗”的。所以,一系列的整数值能够用于为图像编码。类似Iconedit这样的工具就是用于绘图的,他们所输出的是一个包含一系列整型数的ASCII文件,可以被一个窗口程序所包含。它所存在的问题是程序中的图标只是一串十六进制数。在C语言中,典型的16X16的黑白图形可能如下:

static unsigned short stopwatch[] = {
0x07C6,
0x1FF7,
0x383B,
0x600C,
0x600C,
0xC006,
0xC006,
0xDF06,
0xC106,
0xC106,
0x610C,
0x610C,
0x3838,
0x1FF0,
0x07C0,
0x0000
};


正如所看到的那样,这些C语言常量并未有提供有关图形实际模样的任何线索。这里有一个惊人的#define定义的优雅集合,允许程序建立常量使它们看上去像是屏幕上的图形。


#define X )*2+1
#define _ )*2
#define s ((((((((((((((((0 /* For building glyphs 16 bits wide */



定义了它们之后,只要画所需要的图标或者图形等,程序会自动创建它们的十六进制模式。使用这些宏定义,程序的自描述能力大大加强,上面这个例子可以转变为:


static unsigned short stopwatch[] =
{
s _ _ _ _ _ X X X X X _ _ _ X X _ ,
s _ _ _ X X X X X X X X X _ X X X ,
s _ _ X X X _ _ _ _ _ X X X _ X X ,
s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,
s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,
s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,
s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,
s X X _ X X X X X _ _ _ _ _ X X _ ,
s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,
s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,
s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,
s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,
s _ _ X X X _ _ _ _ _ X X X _ _ _ ,
s _ _ _ X X X X X X X X X _ _ _ _ ,
s _ _ _ _ _ X X X X X _ _ _ _ _ _ ,
s _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
};


显然,与前面的代码相比,它的意思更为明显。标准的C语言具有八进制、十进制和十六进制常量,但没有二进制常量,否则的话倒是一种更为简单的绘制图形模式的方法。


================================================================
确实,在源代码中,这个图形显示出来了。
但是,如何在输出到控制台中,也出现这个图形么?

也就是在main中如何使用,才能输出这个图形?
...全文
43 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
N_Sev7 2014-03-25
  • 打赏
  • 举报
回复
引用 1 楼 zengraoli 的回复:

#include "stdio.h"
#include "stdlib.h"


// static unsigned short stopwatch[] = {
// 	0x07C6,
// 	0x1FF7,
// 	0x383B,
// 	0x600C,
// 	0x600C,
// 	0xC006,
// 	0xC006,
// 	0xDF06,
// 	0xC106,
// 	0xC106,
// 	0x610C,
// 	0x610C,
// 	0x3838,
// 	0x1FF0,
// 	0x07C0,
// 	0x0000
// };


#define X )*2+1
#define _ )*2
#define s ((((((((((((((((0 /* For building glyphs 16 bits wide */


static unsigned short stopwatch[] =
{
	s _ _ _ _ _ X X X X X _ _ _ X X _ ,
	s _ _ _ X X X X X X X X X _ X X X ,
	s _ _ X X X _ _ _ _ _ X X X _ X X ,
	s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,
	s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,
	s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,
	s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,
	s X X _ X X X X X _ _ _ _ _ X X _ ,
	s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,
	s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,
	s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,
	s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,
	s _ _ X X X _ _ _ _ _ X X X _ _ _ ,
	s _ _ _ X X X X X X X X X _ _ _ _ ,
	s _ _ _ _ _ X X X X X _ _ _ _ _ _ ,
	s _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
};



int main()
{
	int index;
	printf("1111");
	for (index = 0; index < 16; index++)
	{
		printf("%x", stopwatch[index]);
		printf("\n");
	}
	printf("222");

	return 0;
}
未明白,这里111和222都没输出,输出只有0x07C6、0x1FF7、0x383B……这些的十进制数值,而且是连在一起的。。

int main()
{
	int index;
	printf("1111\n\n\n");    ///多加几个换行你就看到了   - _ -!!!
	for (index = 0; index < 16; index++)
	{
		printf("%x", stopwatch[index]);
		printf("\n");
	}
	printf("\n\n222\n");
	
	return 0;
}
  • 打赏
  • 举报
回复
自己的问题。。编译器 没设置正确。。
  • 打赏
  • 举报
回复

#include "stdio.h"
#include "stdlib.h"


// static unsigned short stopwatch[] = {
// 	0x07C6,
// 	0x1FF7,
// 	0x383B,
// 	0x600C,
// 	0x600C,
// 	0xC006,
// 	0xC006,
// 	0xDF06,
// 	0xC106,
// 	0xC106,
// 	0x610C,
// 	0x610C,
// 	0x3838,
// 	0x1FF0,
// 	0x07C0,
// 	0x0000
// };


#define X )*2+1
#define _ )*2
#define s ((((((((((((((((0 /* For building glyphs 16 bits wide */


static unsigned short stopwatch[] =
{
	s _ _ _ _ _ X X X X X _ _ _ X X _ ,
	s _ _ _ X X X X X X X X X _ X X X ,
	s _ _ X X X _ _ _ _ _ X X X _ X X ,
	s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,
	s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,
	s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,
	s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,
	s X X _ X X X X X _ _ _ _ _ X X _ ,
	s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,
	s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,
	s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,
	s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,
	s _ _ X X X _ _ _ _ _ X X X _ _ _ ,
	s _ _ _ X X X X X X X X X _ _ _ _ ,
	s _ _ _ _ _ X X X X X _ _ _ _ _ _ ,
	s _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
};



int main()
{
	int index;
	printf("1111");
	for (index = 0; index < 16; index++)
	{
		printf("%x", stopwatch[index]);
		printf("\n");
	}
	printf("222");

	return 0;
}
未明白,这里111和222都没输出,输出只有0x07C6、0x1FF7、0x383B……这些的十进制数值,而且是连在一起的。。

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧