4

[解决了]

我在 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/

4

5 回答 5

0

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

像这样的字符文字' '基本上由编译器翻译成整数,您不会期望例如&32(空格的ASCII 代码)可以工作,对吗?

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

于 2017-03-15T06:39:20.417 回答
0

我修复了明显的语法错误,并通过注释 `/* <-- 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 库,也不想安装它。)

于 2017-03-15T08:15:51.800 回答
0

只需阅读您编辑的问题并想提及 LValue:

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

变量具有地址,因此是 LValue。

字符常量(例如'A')具有实际类型int并且不是LValue。

"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:为什么字符串文字是左值,而所有其他文字都是右值?.

于 2017-03-15T09:48:02.370 回答
0

解决了!降级 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

于 2017-03-21T10:29:55.870 回答
0

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

char driver[] = "";
initgraph(&gd, &gm, driver);
于 2017-11-08T18:56:39.827 回答