C++ 图形 initgraph 错误(语法或丢失文件缺陷?)
C++ graphics initgraph error (syntax or missing-file flaw?)
[已解决]
我在 Win10 上使用 CodeBlocks (C++)。我尝试创建一个简单的图形程序 - 我下载了某个图形包(graphics.h 和其他两个与 BGI 相关的文件 - 我在设置等中添加了 lib)。我试过这个程序,但标记的行似乎有问题。我以我认为正确的方式或至少部分地从 Pascal 移植了这个(作为我的老师 - 是的,它是关于大学的 - 只向我们展示了 Pascal 程序)。问题肯定出在指针上(解决后编辑:不是!检查我的答案)。如果需要,我会提供更多详细信息。
问题:我哪里做错了,如何改正(写什么,加什么,删什么)才能正常工作?如果代码没有错误,但我需要一些图形文件才能在我的编译器上运行,这些文件是哪些文件,从哪里获取它们以及将它们放在哪里?
错误(不完全是,现在是 "warning"):
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/
您收到错误消息是因为您尝试获取未存储在内存中的地址。
像' '
这样的字符文字基本上被编译器翻译成整数,你不会期望例如&32
(ASCII code for space)上班好吗?
如果您要传递字符串,请使用 双引号 并且不要使用地址运算符,如 " "
.
我修复了明显的语法错误,并用注释标记了位置 `/* <-- 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库,不想安装。)
刚刚阅读您编辑的问题并想提及 LValue:
"LValue" 表示具有地址的东西,即您可以应用地址运算符 &
。 LValue 因为它可能出现在赋值的左侧。
一个变量有一个地址,因此是一个左值。
字符常量(例如 'A'
)实际上类型为 int
,并且 不是 左值。
一个字符串常量(例如 "Hello"
)的类型为 const char[]
(与 const char*
兼容)是(可能令人惊讶)一个左值,因为编译器必须在某处为其分配数据存储.
因此,即使是以下内容也会 "work":
#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 书。 C 中有很多可能的技巧,但语言本身很棘手。
编辑:
再次阅读我自己的文字,我有点不确定我是否完全正确:因此我再次搜索并找到了这个link:SO: Why are string literals l-value while all other literals are r-value?。
已解决!
降级 CB(我认为是 v16 到 v13,不确定是否有必要)并替换了一些文件。
我遵循了本教程:
https://m.youtube.com/watch?v=FxCdMM9H66I
它与问题中的 link 完全相同,但可能(一个或多个)来自先前 [=31] 的那些文件(graphics.h、winbgim.h、libbgi.a) =] 被窃听,有一些不明显的错误,或者不兼容等等),而我在这个答案中提供的视频制作者提供的文件已得到纠正。我不(真的想)知道。
现在,警告仍然出现,但程序运行完美!
我用 r>=0 替换了 r=0 ,这是一个小错误。 (如果我仍然可以,我会更新问题)
感谢...您的帮助! (不能说 "nothing",我会很刻薄)
:)
编辑:
一些显示圆圈的"cleaner"版本(刚刚意识到问题中的变体不显示实心圆圈):
#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();
}
编辑2:
降级没有必要确认! :D
如果将文字替换为可转换为 char* 的数组,警告应该会消失:
char driver[] = "";
initgraph(&gd, &gm, driver);
[已解决]
我在 Win10 上使用 CodeBlocks (C++)。我尝试创建一个简单的图形程序 - 我下载了某个图形包(graphics.h 和其他两个与 BGI 相关的文件 - 我在设置等中添加了 lib)。我试过这个程序,但标记的行似乎有问题。我以我认为正确的方式或至少部分地从 Pascal 移植了这个(作为我的老师 - 是的,它是关于大学的 - 只向我们展示了 Pascal 程序)。问题肯定出在指针上(解决后编辑:不是!检查我的答案)。如果需要,我会提供更多详细信息。
问题:我哪里做错了,如何改正(写什么,加什么,删什么)才能正常工作?如果代码没有错误,但我需要一些图形文件才能在我的编译器上运行,这些文件是哪些文件,从哪里获取它们以及将它们放在哪里?
错误(不完全是,现在是 "warning"):
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/
您收到错误消息是因为您尝试获取未存储在内存中的地址。
像' '
这样的字符文字基本上被编译器翻译成整数,你不会期望例如&32
(ASCII code for space)上班好吗?
如果您要传递字符串,请使用 双引号 并且不要使用地址运算符,如 " "
.
我修复了明显的语法错误,并用注释标记了位置 `/* <-- 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库,不想安装。)
刚刚阅读您编辑的问题并想提及 LValue:
"LValue" 表示具有地址的东西,即您可以应用地址运算符 &
。 LValue 因为它可能出现在赋值的左侧。
一个变量有一个地址,因此是一个左值。
字符常量(例如 'A'
)实际上类型为 int
,并且 不是 左值。
一个字符串常量(例如 "Hello"
)的类型为 const char[]
(与 const char*
兼容)是(可能令人惊讶)一个左值,因为编译器必须在某处为其分配数据存储.
因此,即使是以下内容也会 "work":
#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 书。 C 中有很多可能的技巧,但语言本身很棘手。
编辑:
再次阅读我自己的文字,我有点不确定我是否完全正确:因此我再次搜索并找到了这个link:SO: Why are string literals l-value while all other literals are r-value?。
已解决! 降级 CB(我认为是 v16 到 v13,不确定是否有必要)并替换了一些文件。 我遵循了本教程: https://m.youtube.com/watch?v=FxCdMM9H66I 它与问题中的 link 完全相同,但可能(一个或多个)来自先前 [=31] 的那些文件(graphics.h、winbgim.h、libbgi.a) =] 被窃听,有一些不明显的错误,或者不兼容等等),而我在这个答案中提供的视频制作者提供的文件已得到纠正。我不(真的想)知道。 现在,警告仍然出现,但程序运行完美! 我用 r>=0 替换了 r=0 ,这是一个小错误。 (如果我仍然可以,我会更新问题)
感谢...您的帮助! (不能说 "nothing",我会很刻薄) :)
编辑:
一些显示圆圈的"cleaner"版本(刚刚意识到问题中的变体不显示实心圆圈):
#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();
}
编辑2: 降级没有必要确认! :D
如果将文字替换为可转换为 char* 的数组,警告应该会消失:
char driver[] = "";
initgraph(&gd, &gm, driver);