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

mum43rcc  于 2023-04-13  发布在  其他
关注(0)|答案(5)|浏览(140)

[已解决]

我使用CodeBlocks我试着创建一个简单的图形程序--我下载了一定的图形包(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/

nbewdwxp

nbewdwxp1#

你得到一个错误,因为你试图采取的地址,而不是存储在内存中。
' '这样的字符字面量基本上是由编译器翻译成整数的,你不会期望例如&32(空间的ASCII code)工作吧?
如果要传递一个字符串,请使用 * 双引号 *,不要使用address-of运算符,如" "

w51jfk4q

w51jfk4q2#

请阅读您编辑的问题,并想提及LValue:
“LValue”表示有地址的东西,即你可以应用地址运算符&.LValue,因为它可能出现在赋值的左侧。
一个变量有一个地址,因此是一个左值。
一个字符常量(例如'A')实际上有int类型,并且 * 不是 * 一个LValue。
一个类型为const char[](与const char*兼容)的字符串常量(例如"Hello")是(可能令人惊讶地)一个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。)
1.它崩溃是因为常量字符串被修改了。
(It可能不会在任何平台上崩溃。)
然而,我建议不要修改字符串常量,但它演示了我试图解释的关于LValues的内容。
我希望这个例子不会再让你感到困惑了。我强烈建议你去买一本好的C书。C语言中有很多技巧,但语言本身就是很棘手的。
编辑:
再次阅读我自己的文本,我感到有点不确定我是否说得完全正确:于是我又google了一下,找到了这个链接:SO: Why are string literals l-value while all other literals are r-value?

nhaq1z21

nhaq1z213#

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

aij0ehis

aij0ehis4#

解决了!降级了CB(我想是v16到v13,不确定是否有必要)并替换了一些文件。我遵循了这个教程:https://m.youtube.com/watch?v=FxCdMM9H66I它与问题中的链接完全相同,但可能(一个或多个)这些文件(graphics. h,winbgim. h,libbgi. a)从以前的链接被窃听,有一些不明显的错误左右,或不兼容等),而我在这个答案中提供的视频的制造商提供的文件被更正。我不(真的想)知道。现在,警告仍然出现,但是程序运行得很完美!我把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();
}
  • EDIT 2:* 不需要降级确认!:D
arknldoa

arknldoa5#

如果你用一个可以转换成char* 的数组替换这个文字,这个警告应该会消失:

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

相关问题