[解决]
我在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/
答案 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)
所以你看到两件重要的事情:
编译好。 (编译器不怀疑更改LValue。)
因为修改了常量字符串而导致崩溃。
(它可能不会在任何平台上崩溃。)
然而,我建议不要修改字符串常量,但它演示了我试图解释的有关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);