今天不打游戏了,就接着写文章吧。现在已经到了编写关于树这个重要的数据结构的时候了,前面二查查找树已经完成,昨天AVL平衡树已经实现了,总想用一个比较直观方法显示树,这当然要图形啦。
在LINUX下不能够直接像用TC的BGL那样进行绘图,需要借助图形库。LINUX下可选的图形库很多,我知道的有,QT/GTK/SDL/CURSES,NCURSES/MiniGuit/SVGALIB等等,如果想在Console下用的话,我想大概最容易上手不需要启动X的大概要数Cursees/NCurses/SVGALIB。实际上NCurses是基于Curse库的,并且两者都是基于字符的,也就是说在80x24的Console上你只能是进行基于字符的处理,而非像素,也就是说你不能你TC里那样画线画圆,等等,你可以想像一下当见的vi,基于这个库,就可以做出那样的界面简洁功能强大的编辑工具!要在Console下绘图话,你需要SVGALIB,虽然这是一个如此老的库!这个库是可以在官方站点上下载到源代码:http:// www.svgalib.org,和很多第一次下载代码的人一样,让我无法理解的是,下载的源代码不知道是因为编译器不同还是怎么回事,居然出现很多貌似c的语法错误,有些网友已经把大部分错误纠正过来了,但是在我的系统(ubuntu 7.10 server+fvwm,gcc 4.1.3)上还存在其它错误。下面就介绍怎么样纠正源代码和安装:
在http://www.svgalib.org下载 svgalib-1.4.3.tar.gz
解压:
tar xvf svgalib-1.4.3.tar.gz
接着,
1.这是从网上找到的纠正过程,一步步照做。
首先修改makefile.cfg。
/usr/local/lib -> /usr/lib
:注,这一步我并没有进行修改。
然后分别修改以下代码:
demos/speedtest.c
demos/linearspeed.c
gl/inlstring.h
change "movzbl **,ax" in __memset() to "movzbl **,eax"
demos/lineart.c
in screen() gcc complained of missing terminator for
the first printf statement. Put it all on one line.
src/vgabg.h
delete this:
extern void *__svgalib_linearframebuffer;
src/mach32.c
add this:
extern void *__svgalib_linearframebuffer;
after the label finish_w_eeprom: in mach32_init() add a ";"
src/vga.c
add this:
extern void *__svgalib_linearframebuffer;
in initialize() change the test "if ((long) GM < 0)" to
"if ((void *) GM == MAP_FAILED)"
-- the GETINT macro is broken; remove it and replace code
that uses it with this:
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.HDisplay = atoi(ptr);
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.HSyncStart = atoi(ptr);
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.HSyncEnd = atoi(ptr);
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.HTotal = atoi(ptr);
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.VDisplay = atoi(ptr);
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.VSyncStart = atoi(ptr);
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.VSyncEnd = atoi(ptr);
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.VTotal = atoi(ptr);
src/apm.c
code at the end of apm_saveregs() caused "invalid lvalue
in assignment" errors. It's a little unclear; there may
be inconsistencies about register sizes. Since I don't
have this equipment (I think), I couldn't test it.
But it compiles if you change the last 6 assignments to
*(unsigned long *)(&(regs[APMREG_SAVE(18)])) =
inlXR(0xf0) ;
*(unsigned long *)(&(regs[APMREG_SAVE(22)])) =
inlXR(0xf4) ;
*(unsigned long *)(&(regs[APMREG_SAVE(26)])) =
inlXR(0x140) ;
*(unsigned short *)(&(regs[APMREG_SAVE(30)])) =
inXR(0x144) ;
*(unsigned long *)(&(regs[APMREG_SAVE(32)])) =
inlXR(0x148) ;
*(unsigned short *)(&(regs[APMREG_SAVE(36)])) =
inXR(0x14c) ;
src/s3.c
after the label "default:" at end of s3_ext_set() add a ";"
2。除以上错误外,我的GCC还是不依不饶。如果你也有同样错误,请按以下修改:
./src/apm.c
行154~159,把每行的(unsign long)去除,这里出现的是无效的左值(lvalue)错误
?奇怪,这种c语言在其它编译器可以通过吗?
./src/mach32.c
行 1594末尾加上分号
似乎还有一些文件中也有这样label末尾的"compound statement"错误,如果有,就加分号就是了。
3。修正以上错误后再根据自己的情况看看,总之看起来都像是c语法错误(我不敢那么大胆公然说这是语法错误啦^_^)。
接着输入
make install
make demoprogs
安装完成
用以下程序测试一下吧:
/*testSVGA.c*/
#include <stdio.h>
#include <vga.h>
int main()
{
int i;
vga_init();//vga初始化
vga_setmode(G800x600x256);//设置屏幕的显示模式
vga_setcolor(5);//选用5号颜色
vga_drawline(50,50,350,350);//用5号颜色画一条线段
vga_getch(); //得到任意键
vga_setmode(TEXT);//回到控制台字符模式
return 0;
}
编译运行:
gcc -testSVGA.c -o testSVGA -lvga
./testSVGA
接下来我在Console下绘制树的c函数接口玩一下,并用来测试AVL树^_^
在LINUX下不能够直接像用TC的BGL那样进行绘图,需要借助图形库。LINUX下可选的图形库很多,我知道的有,QT/GTK/SDL/CURSES,NCURSES/MiniGuit/SVGALIB等等,如果想在Console下用的话,我想大概最容易上手不需要启动X的大概要数Cursees/NCurses/SVGALIB。实际上NCurses是基于Curse库的,并且两者都是基于字符的,也就是说在80x24的Console上你只能是进行基于字符的处理,而非像素,也就是说你不能你TC里那样画线画圆,等等,你可以想像一下当见的vi,基于这个库,就可以做出那样的界面简洁功能强大的编辑工具!要在Console下绘图话,你需要SVGALIB,虽然这是一个如此老的库!这个库是可以在官方站点上下载到源代码:http:// www.svgalib.org,和很多第一次下载代码的人一样,让我无法理解的是,下载的源代码不知道是因为编译器不同还是怎么回事,居然出现很多貌似c的语法错误,有些网友已经把大部分错误纠正过来了,但是在我的系统(ubuntu 7.10 server+fvwm,gcc 4.1.3)上还存在其它错误。下面就介绍怎么样纠正源代码和安装:
在http://www.svgalib.org下载 svgalib-1.4.3.tar.gz
解压:
tar xvf svgalib-1.4.3.tar.gz
接着,
1.这是从网上找到的纠正过程,一步步照做。
首先修改makefile.cfg。
/usr/local/lib -> /usr/lib
:注,这一步我并没有进行修改。
然后分别修改以下代码:
demos/speedtest.c
demos/linearspeed.c
gl/inlstring.h
change "movzbl **,ax" in __memset() to "movzbl **,eax"
demos/lineart.c
in screen() gcc complained of missing terminator for
the first printf statement. Put it all on one line.
src/vgabg.h
delete this:
extern void *__svgalib_linearframebuffer;
src/mach32.c
add this:
extern void *__svgalib_linearframebuffer;
after the label finish_w_eeprom: in mach32_init() add a ";"
src/vga.c
add this:
extern void *__svgalib_linearframebuffer;
in initialize() change the test "if ((long) GM < 0)" to
"if ((void *) GM == MAP_FAILED)"
-- the GETINT macro is broken; remove it and replace code
that uses it with this:
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.HDisplay = atoi(ptr);
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.HSyncStart = atoi(ptr);
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.HSyncEnd = atoi(ptr);
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.HTotal = atoi(ptr);
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.VDisplay = atoi(ptr);
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.VSyncStart = atoi(ptr);
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.VSyncEnd = atoi(ptr);
ptr = strtok(NULL, " "); if(!ptr) break;
mmt.VTotal = atoi(ptr);
src/apm.c
code at the end of apm_saveregs() caused "invalid lvalue
in assignment" errors. It's a little unclear; there may
be inconsistencies about register sizes. Since I don't
have this equipment (I think), I couldn't test it.
But it compiles if you change the last 6 assignments to
*(unsigned long *)(&(regs[APMREG_SAVE(18)])) =
inlXR(0xf0) ;
*(unsigned long *)(&(regs[APMREG_SAVE(22)])) =
inlXR(0xf4) ;
*(unsigned long *)(&(regs[APMREG_SAVE(26)])) =
inlXR(0x140) ;
*(unsigned short *)(&(regs[APMREG_SAVE(30)])) =
inXR(0x144) ;
*(unsigned long *)(&(regs[APMREG_SAVE(32)])) =
inlXR(0x148) ;
*(unsigned short *)(&(regs[APMREG_SAVE(36)])) =
inXR(0x14c) ;
src/s3.c
after the label "default:" at end of s3_ext_set() add a ";"
2。除以上错误外,我的GCC还是不依不饶。如果你也有同样错误,请按以下修改:
./src/apm.c
行154~159,把每行的(unsign long)去除,这里出现的是无效的左值(lvalue)错误
?奇怪,这种c语言在其它编译器可以通过吗?
./src/mach32.c
行 1594末尾加上分号
似乎还有一些文件中也有这样label末尾的"compound statement"错误,如果有,就加分号就是了。
3。修正以上错误后再根据自己的情况看看,总之看起来都像是c语法错误(我不敢那么大胆公然说这是语法错误啦^_^)。
接着输入
make install
make demoprogs
安装完成
用以下程序测试一下吧:
/*testSVGA.c*/
#include <stdio.h>
#include <vga.h>
int main()
{
int i;
vga_init();//vga初始化
vga_setmode(G800x600x256);//设置屏幕的显示模式
vga_setcolor(5);//选用5号颜色
vga_drawline(50,50,350,350);//用5号颜色画一条线段
vga_getch(); //得到任意键
vga_setmode(TEXT);//回到控制台字符模式
return 0;
}
编译运行:
gcc -testSVGA.c -o testSVGA -lvga
./testSVGA
接下来我在Console下绘制树的c函数接口玩一下,并用来测试AVL树^_^