zoukankan      html  css  js  c++  java
  • 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 里面。

  • 相关阅读:
    java语法基础(总结)
    ZookeeperclientAPI之创建会话(六)
    对A轮的追逐变得越加狂热,当前距离互联网泡沫到底有多近?
    Java集合(一):Java集合概述
    深入了解Cookie(1)------selenium2进行Cookie操作的前奏
    Cocos2d-X开发中国象棋《九》走棋规则
    java中request,application,session三个域及参数简单示例
    在多浏览器使用JS复制内容到剪切板,无需插件
    初学structs2,结果类型简单示例
    使用servletAPI三种方式简单示例
  • 原文地址:https://www.cnblogs.com/chinaqzh/p/2473787.html
Copyright © 2011-2022 走看看