【问题标题】:C++ graphics initgraph error (syntax or missing-file flaw?)C++ 图形初始化图错误(语法或缺失文件缺陷?)
【发布时间】:2017-03-15 06:33:17
【问题描述】:

[已解决]

我在 Win10 上使用 CodeBlocks (C++)。我尝试创建一个简单的图形程序 - 我下载了某个图形包(graphics.h 和其他两个与 BGI 相关的文件 - 我在设置等中添加了 lib)。我试过这个程序,但标记的行似乎有问题。我以正确的方式或至少部分地从 Pascal 移植了这个(作为我的老师 - 是的,这是关于大学的 - 只向我们展示 Pascal 程序)。问题肯定出在指针上(解决后编辑:不是!,检查我的答案)。如果需要,我会提供更多详细信息。

问题:我在哪里犯了错误以及如何纠正它们(写什么,添加什么,删除什么),以便它可以正常工作?如果代码没有错误,但我需要一些图形文件才能在我的编译器上运行,这些文件是什么,从哪里获取它们以及放在哪里?

错误(不完全是,现在是“警告”):

deprecated conversion from string constant to 'char*' [-Wwrite-strings]

(请参阅下面的代码)

请阅读:对于我的程序的固定版本,我将非常感激。参考是无用的,所以除非您真的想帮助我(谢谢!),否则请离开此页面。我唯一相关的能力是比较一个程序的两个版本,它们打算做同样的事情,但一个有错误(或更多)。

代码(更新!):

#include<iostream>
#include<graphics.h>
#include<conio.h>
using namespace std;
int main(){
int gr,xmax,ymax,r;
int gm,gd;
gd=DETECT;
gm=0;
initgraph(&gd, gm, "C:\\TC\\BGI"); /*edit(solved): followed the tutorial linked in my answer; not a directory in my PC.*/
gr=graphresult();
if(gr!=grOk) cout<<"Error!";
    else    {xmax=getmaxx();
            ymax=getmaxy();
            cout<<"Resol.: "<<xmax+1<<"x"<<ymax+1;}
setcolor(7);rectangle(0,0,xmax,ymax);setcolor(5);line(0,0,xmax,ymax);line(0,ymax,xmax,0);setcolor(3);
for(r=(ymax+1)/2;r>=0;r--) circle((xmax+1)/2,(ymax+1)/2,r);
getch();
closegraph();
return 0;
}

graphics.h 来源和指南:http://www.codewithc.com/how-to-include-graphics-h-in-codeblocks/

【问题讨论】:

  • 我听说我需要一些 .bgi 文件 - 驱动程序(init 中的第三个“参数”与它们有关)。我没有。我可以尝试将它们放在程序的目录中(因为我知道将在程序(主要是.cpp)所在的目录中搜索.bgi-s。)
  • -得到 egavga.bgi -
  • 请删除gm 声明中的*。这是错的。如果DETECT 不起作用,您可以尝试gd = VGA; gm = VGAHI;(或相应的整数常量)。并在initgraph() 的调用中在gm 之前插入&amp;
  • 到它上面,结果是 2 分钟
  • 比以前更大的错误i66.tinypic.com/1zx0bjd.jpg

标签: c++ graphics codeblocks deprecated bgi


【解决方案1】:

您收到错误是因为您尝试获取未存储在内存中的地址。

' ' 这样的字符文字基本上被编译器翻译成整数,你不会期望例如&amp;32(空间的ASCII code)你会工作吗?

如果您要传递一个字符串,请使用 双引号 并且不要使用地址运算符,如 " "

【讨论】:

  • " " 导致 " Invalid conversion from int to int* " 并且日志显示 " initialising argument 1 of .." 指向这行 graphics.h: void initgraph( int * graphdriver, int * graphmode, char * pathtodriver ); .实际上,这是非常有效的信息 - 文字没有地址(或者有吗?无论如何,这不是问题的重点)所以 .h 是错误的......(我移动了我的通讯)
  • @MihaiFlorea 那是因为您对该函数调用还有其他问题。参见例如this reference (with an example) 了解如何使用initgraph 功能。
  • 您能回答我的代码的固定版本吗?对我来说,只比较好与坏要容易得多。因此,我尝试将模式(initgraph 中的第二个变量)设置为零并删除无用的 gm。没有改进。
  • 当要求“我的代码的固定版本”时,我不禁想到:SO是关于回答问题(让人们能够解决他们的问题),不为他们解决问题。但我可能错了,请随意忽略我。
  • 是的,但是当你有像我这样的人寻求帮助时,他会像 O_o 一样看着你吗?直到你准确指出他做错了什么并解释如何纠正它,当他满意后会崇拜你“啊啊啊!所以这就是如何解决它?多么简单!不敢相信我一开始没看到! "
【解决方案2】:

刚刚阅读了您编辑的问题并想提及 LValue:

“LValue”表示具有地址的东西,即您可以应用地址运算符&amp;。 LValue,因为它可能出现在赋值的左侧。

一个变量有一个地址,因此是一个左值。

一个字符常量(例如'A')实际上的类型是int,并且不是一个左值。

字符串常量(例如"Hello")的类型为const char[](与const char* 兼容)是(可能令人惊讶)LValue,因为编译器必须在某处为其分配数据存储。

因此,即使是以下内容也可以“工作”:

#include <stdio.h>
int main()
{
  char *sz = "Hello";
  printf("address of \"%s\": %p\n", sz, sz);
  printf("address of sz: %p\n", &sz);
  sz[0] = 'h';
  printf(sz);
  return 0;
}

我使用 gcc 和 cygwin(在 Windows 10 - 64 位上)编译和测试:

$ gcc -o test-cstringlvalue test-cstringlvalue.c 

$ ./test-cstringlvalue.exe
address of "Hello": 0x403060
address of sz: 0x61cc6c
Segmentation fault (core dumped)

所以你看到了两件重要的事情:

  1. 它编译得很好。 (编译器不会怀疑更改 LValue。)

  2. 由于修改了常量字符串而崩溃。

(它可能不会在任何平台上崩溃。)

但是,我建议不要修改字符串常量,但它展示了我试图解释的关于 LValues 的内容。

我希望样本不会再让您感到困惑。我强烈建议买一本好的 C 书。 C 中有很多技巧,但语言本身很棘手。

编辑:

再次阅读我自己的文字,我有点不确定我是否完全正确:因此我再次搜索并找到此链接:SO: Why are string literals l-value while all other literals are r-value?

【讨论】:

  • 这如何帮助我修复程序?
  • @MihaiFlorea 您的问题仍然是您的问题中所述的问题吗? '“为什么程序编译不成功?”在这种情况下,一些程序员老兄已经给出了答案。它也可以在我在第一个答案中提供的示例代码中找到。我只是试图在第二个答案中详细说明背景。
  • 进行了重大修改!请再次阅读问题和详细信息。
【解决方案3】:

我修复了明显的语法错误并用注释标记了位置 `/*

#include<iostream>
#include<graphics.h>
#include<conio.h>
using namespace std;
int main()
{
  int gr,xmax,ymax,r;
  int gm,gd; /* <-- FIXED */
  gd=DETECT;
  gm=0;
  initgraph(&gd, &gm, "C:/Users/MyName/Desktop/WORKFOLDER/"); /* <-- FIXED */
  gr=graphresult();
  if(gr!=grOk) cout<<"Error!";
  else {
    xmax=getmaxx();
    ymax=getmaxy();
    cout<<"Resol.: "<<xmax+1<<"x"<<ymax+1;
  }
setcolor(7);rectangle(0,0,xmax,ymax);setcolor(5);line(0,0,xmax,ymax);line(0,ymax,xmax,0);setcolor(3);
  for(r=(ymax+1)/2;r=0;r--) circle((xmax+1)/2,(ymax+1)/2,r);
  getch();
  closegraph();
  return 0;
}

很遗憾,我无法编译和测试它。 (我没有 BGI 库,也不想安装它。)

【讨论】:

  • [可能是我的心情问题] 先生,您给了我和之前那个人一样的链接。我碰巧很固执和愚蠢:如果没有人纠正我的程序,我什么都不会理解。这个网络上的每个人都只为我提供了很多参考资料,这些参考资料只会让我的想法变得更糟,让我更加卡住。无论如何感谢您的帮助,但......现在不能用它做任何事情?
  • @MihaiFlorea 我之前没有看到链接 - 抱歉。 initgraph() 的第三个参数是char* 类型,旨在为(正如我已经提到的)驱动程序路径获取一个 C 字符串。 C 字符串可以记为"",其中文本可能出现在双引号之间。 ' ' 不是 C 字符串,而是字符常量。不允许在其上应用地址运算符&amp;。对我来说,你似乎很难理解 C 语言本身(特别是字符和 C 字符串)。因此,您可以研究这个方向。 (这实际上与图形无关。)
  • 好吧,我将尝试使用您提供的示例。我现在正在使用电话,所以这几乎是要求直接纠正的原因(我似乎没有收到) 了解我的头撞到墙上三个小时,而没有人能够为我提供 2 分钟更正。我们都假装互相帮助。不过没关系,我很确定我会在两个小时内自己修复它。
  • 我刚刚尝试编译这段代码。错误:警告:不推荐将字符串常量转换为 'char*' [-Wwrite-strings]
  • 而且...“但可能你必须提供实际的文件路径。” --- 到什么文件?正如我之前所说,我听说我需要一些用于 DriverPath 的 .(dot)BGI 文件(它们是“驱动程序”)。 Google 了 20 分钟,没有下载链接左右..
【解决方案4】:

解决了! 降级 CB(我认为 v16 到 v13,不确定是否有必要)并替换了一些文件。 我遵循了本教程: https://m.youtube.com/watch?v=FxCdMM9H66I 它与问题中的链接完全相同,但可能(一个或多个)来自上一个链接的那些文件(graphics.h、winbgim.h、libbgi.a)被窃听,有一些不明显的错误,或者是不兼容等),而我在此答案中提供的 vid 制作者提供的文件已得到纠正。我不(真的想)知道。 现在,警告仍然出现,但程序运行完美! 我用 r>=0 替换了 r=0 ,这是一个小错误。 (如果我还能更新问题,我会更新)

感谢...您的帮助! (不能说“什么都没有”,我会很刻薄) :)

编辑:

一些显示圆圈的“更清洁”版本(刚刚意识到问题中的变体不显示实心圆圈):

#include<iostream>
#include<graphics.h>
#include<dos.h>
using namespace std;
main(){
int gm,gd,gr,xmax,ymax,r;
gd=DETECT;
gm=0;
initgraph(&gd,&gm,"C:\\TC\\BGI");
gr=graphresult();
if(gr!=grOk) cout<<"Error!";
    else    {xmax=getmaxx();
            ymax=getmaxy();
            cout<<"Res.: "<<xmax+1<<"x"<<ymax+1;}
setcolor(7);
rectangle(0,0,xmax,ymax);
setcolor(5);
line(0,0,xmax,ymax);
line(0,ymax,xmax,0);
setcolor(3);
for(r=(ymax+1)/2;r>=0;r--) circle((xmax+1)/2,(ymax+1)/2,r);
getch();
closegraph();
}

EDIT2: 无需降级 已确认! :D

【讨论】:

    【解决方案5】:

    如果您将文字替换为可转换为 char* 的数组,该警告应该会消失:

    char driver[] = "";
    initgraph(&gd, &gm, driver);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-26
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 2018-08-22
      • 1970-01-01
      • 2015-09-29
      相关资源
      最近更新 更多