C ++图形initgraph错误(语法或丢失文件缺陷?)

时间:2017-03-15 06:33:17

标签: c++ graphics codeblocks deprecated bgi

[解决]

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

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

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

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

(请参阅下面的代码)

请阅读:对于我的程序的固定版本,我会非常好。反馈是无用的,所以除非你真的想帮助我(谢谢!),请离开此页面。我唯一相关的能力是比较一个程序的两个版本,这两个版本的目的是做同样的事情但是一个有错误(或更多)。

CODE(已更新!):

#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/

5 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我修复了明显的语法错误并通过注释标记了这些地方`/ *&lt; - FIXED * /:

#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库,也不想安装它。)

答案 2 :(得分:0)

请阅读您编辑过的问题,并想提及有关LValue的信息:

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

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

字符常量(例如'A')实际上已键入int为LValue。

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

因此,即使以下情况也会工作&#34;:

#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. 因为修改了常量字符串而导致崩溃。

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

    然而,我建议不要修改字符串常量,但它演示了我试图解释的有关LValues的内容。

    我希望样本不再混淆你了。我热烈建议你买一本好书。 C中有很多技巧,但语言本身很棘手。

    编辑:

    再次阅读我自己的文字我觉得有点不确定我是否完全正确地说:因此我再次搜索了这个链接:SO: Why are string literals l-value while all other literals are r-value?

答案 3 :(得分:0)

解决! 降级CB(我认为v16到v13,不确定是否有必要)并更换了一些文件。 我按照本教程: https://m.youtube.com/watch?v=FxCdMM9H66I 这与问题中的链接完全相同,但可能(一个或多个)来自上一个链接的那些文件(graphics.h,winbgim.h,libbgi.a)被窃听,有一些不明显的错误,或者是不兼容的等等),而我在这个答案中提供的视频制作者提供的文件已得到纠正。我不(真的很想)知道。 现在,警告仍然出现,但程序运行完美! 我用r&gt; = 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

答案 4 :(得分:0)

如果用可以转换为char *:

的数组替换文字,警告应该消失
char driver[] = "";
initgraph(&gd, &gm, driver);