Turbo C 2.0 图形程序 出现错误: BGI Error: Graphics not initialized ,use 'initgraph'

许多刚学 Turbo C 2.0(以下简称 tc)的人在做图形程序时都遇到过下面这个错误吧:

BGI Error: Graphics not initialized (use 'initgraph')

原因只有一个:程序找不到 BGI 图形驱动,初始化出错了。

请看我写的两种正确的调用方法:

方法一,比较正宗:

假设 tc 安装在 c:\tc20 下,要根据你的 tc 所在路径修改代码中的红色部分(路径中的反斜杠是转义符,要用 \\ 表示 \)。

 1 #include <conio.h>
 2 #include <graphics.h>
 3 
 4 void main()
 5 {
 6    int gdriver=VGA, gmode=VGAHI;
 7    initgraph(&gdriver, &gmode, "c:\\tc20\\bgi");
 8 
 9     rectangle(100,100,300,300); /*画一个方块测试*/
10 
11    getch();
12     closegraph();
13 }

方法二,比较偷懒:

使用以下代码前,请将 bgi 文件夹下的 EGAVGA.BGI 拷贝一份到上级目录,就是和 tc.exe 在同一个目录内。

 1 #include <stdio.h>
 2 #include <conio.h>
 3 #include <graphics.h>
 4 
 5 void main()
 6 {
 7    int gdriver=VGA, gmode=VGAHI;
 8    initgraph(&gdriver, &gmode, NULL);
 9 
10     rectangle(100,100,300,300); /*画一个方块测试*/
11 
12     getch();
13     closegraph();
14 }

是的,BGI 的路径写 NULL 就可以了,initgraph 会在当前路径下找的。就算用的第一种方法,如果没有找到图形驱动,也会再找一下当前路径的。以下是 Borland C++ 3.1 中对第三个路径参数的描述(tc 通用):

pathtodriver: Specifies the directory path where initgraph looks for graphics drivers (*.BGI) first.

      ▪ If they're not there, initgraph looks in the current directory.

      ▪ If pathtodriver is null, the driver files must be in the current directory.

所以,编译后的 exe 程序,不管是用的第一种还是第二种方法,也必须将 EGAVGA.BGI 文件和编译后的 exe 文件放在一起。

说到这里,有些朋友可能看别的书这么写:进入 dosshell,用 BGIOBJ.EXE 将 EGAVGA.BGI 转换为 EGAVGA.OBJ,用 TLIB 将 EGAVGA.OBJ 链接入 GRAPHICS.LIB 图形库,然后在程序里面写上 registerbgidriver(EGAVGA_driver) 注册驱动……

书上写的没有错,目的是为了将图形库链入最终编译的 exe 文件。

我个人不建议链入图形驱动库,安装软件的时候都是好多文件呢,很少有单个文件的程序。既然多数软件都这么做,我们为什么非要将程序弄成一个文件呢?

从架构上讲,多个文件是有好处的(这里不讨论粒度问题)。比如,如果 tc 更新了 EGAVGA.BGI 文件(仅仅假设),那么我们只需要把这个文件拷贝到程序目录里面即可,不用重新编译程序。

如果是 Borland C++ 3.1,前面的内容都适用,毕竟是一个公司的产品。唯一需要注意的是,第二种比较偷懒的方法,要注意,bc 的启动文件在 bin 文件夹中。也就是说,要将 EGAVGA.BGI 拷贝到 bin 里面。