这个控制台程序在不同的编译器里会有不同的问题,谁帮我看一下?

MHBBCRCPJ 2010-07-09 06:32:40
点击这里查看程序中使用的结构体和API函数

我严重怀疑是我写的程序的问题,所以还是发代码吧:
目前只有在VC6里面能正常编译,DEV-CPP和VS2008都有问题
我已经被这些问题搞的不想写了,谁来帮帮我啊
目标是最好能在VS2008里面正常编译,因为VS2008比VC6好用一点

#include <windows.h>
#include <string.h>
#include <stdio.h>

class Label
{
public:
Label(int left, int top, int width, int height, char *caption, WORD _attrib);

void left(int left);
void top(int top);
void width(int width);
void height(int height);

void refresh(void);

private:
CHAR_INFO *buffer;
char *caption;
COORD bufCoord;
COORD bufSize;
SMALL_RECT site;
WORD attrib;
};

Label::Label(int left, int top, int width, int height, char *_caption, WORD _attrib)
{
bufCoord.X = 0;
bufCoord.Y = 0;
bufSize.X = width;
bufSize.Y = height;
site.Left = left;
site.Top = top;
site.Right = left + width - 1;
site.Bottom = top + height - 1;
buffer = new CHAR_INFO [width * height];
caption = new char [strlen(_caption)];
strcpy(caption, _caption);
attrib = _attrib;

refresh();

return;
}

void Label::left(int left)
{
site.Right += left - site.Left;
site.Left = left;
refresh();

return;
}
void Label::top(int top)
{
site.Bottom += top - site.Top;
site.Top = top;
refresh();

return;
}
void Label::width(int width)
{
bufSize.X = width;
site.Right = site.Left + width - 1;
refresh();

return;
}
void Label::height(int height)
{
bufSize.Y = height;
site.Bottom = site.Top + height - 1;
refresh();

return;
}
void Label::refresh(void)
{
CHAR_INFO *pb = buffer;
char *pc = caption;
int i;

for (; pb->Char.AsciiChar = *pc; pb++,pc++);
i = strlen(caption);
i = bufSize.X * bufSize.Y - i;
for (; i>0; pb++,i--)
pb->Char.AsciiChar = ' ';
for (i = bufSize.X * bufSize.Y, pb = buffer; i>0; pb++,i--)
pb->Attributes = attrib;

WriteConsoleOutput(
GetStdHandle(STD_OUTPUT_HANDLE),
buffer,
bufSize,
bufCoord,
&site);

return;
}

int main()
{
Label a(0,0,8,2,"abcdefghijklmnop",0x47);

for (int i=1; i<20; i++)
{
Sleep(100);
system("cls");
a.top (i);
Sleep(100);
system("cls");
a.left (i);
}

return (0);
}
...全文
231 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
MHBBCRCPJ 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 gz_qmc 的回复:]
没有分配分,从新结
[/Quote]
分完了
gz_qmc 2010-07-10
  • 打赏
  • 举报
回复
没有分配分,从新结
MHBBCRCPJ 2010-07-10
  • 打赏
  • 举报
回复
怎么回事?怎么没显示得分?我是正常结贴啊
MHBBCRCPJ 2010-07-10
  • 打赏
  • 举报
回复
哎,看来我和月经贴很有缘啊,这两个问题绝对已经被千千万万的人问过了
zhangweiit 2010-07-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mhbbcrcpj 的回复:]

引用 12 楼 pgplay 的回复:
对了,如果还不行,就把WriteConsoleOutput函数改成WriteConsoleOutputA强制使用ANSI版的,因为,VS2008默认应用了UNICODE和_UNICODE因此会使用Unicode版的函数WriteConsoleOutputW

vs2008还真是事多啊,这个也不错
[/Quote]

不要手动去改A或是W的东西,A,W本来就是自动切换的,根据编译选项,
要改的话,就到项目-》属性中看是否用UNICODE,或是在C|C++选项的高级选项中,加入 /D UNICODE编译选项
zhangweiit 2010-07-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mhbbcrcpj 的回复:]

我是这样弄的:
文件->新建->项目->点击 Win32控制台应用程序->名称里填名->确定->下一步->勾选 空项目->完成->右键点击源文件文件夹->添加->新建项->名称里填 main.cpp->添加->把代码粘贴到main.cpp里->生成->生成解决方案->调试->启动调试

哪步错了么?
[/Quote]

你在新建项目时,有一个 预编译头文件的选项,那个复选框不要选,否则必须要用stdafx.h
然后,字符集也会受影响
MHBBCRCPJ 2010-07-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pgplay 的回复:]
对了,如果还不行,就把WriteConsoleOutput函数改成WriteConsoleOutputA强制使用ANSI版的,因为,VS2008默认应用了UNICODE和_UNICODE因此会使用Unicode版的函数WriteConsoleOutputW
[/Quote]
vs2008还真是事多啊,这个也不错
MHBBCRCPJ 2010-07-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 gz_qmc 的回复:]
你可能设置成UNICODE了
[/Quote]
眼熟,好像在哪看到过.

不过终于解决了,第一问题是我的错,第二个就不是我的错了



[Quote=引用 4 楼 gz_qmc 的回复:]
建议楼主将这句
Label a(0,0,8,2,"abcdefghijklmnop",0x47);
改为
Label a(0,0,8,2,"abcdefghijklmnop\0",0x47);

我觉得你的字串没有结束是个危险
[/Quote]
""里面的字符串会自动加上'\0'吧?
cattycat 2010-07-09
  • 打赏
  • 举报
回复
对了,我这里可以运行是因为我把我的vs编码设成ansi的,vs默认用的是unicode的。
atl+f7,在general中的character set中选Use Multi-Byte Character Set。
耍宝王 2010-07-09
  • 打赏
  • 举报
回复
对了,如果还不行,就把WriteConsoleOutput函数改成WriteConsoleOutputA强制使用ANSI版的,因为,VS2008默认应用了UNICODE和_UNICODE因此会使用Unicode版的函数WriteConsoleOutputW
gz_qmc 2010-07-09
  • 打赏
  • 举报
回复
你可能设置成UNICODE了
cattycat 2010-07-09
  • 打赏
  • 举报
回复
你vs08编译没报错吧。
MHBBCRCPJ 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 pgplay 的回复:]
caption = new char [strlen(_caption)];
应该改成:caption = new char [strlen(_caption) + 1];吧
[/Quote]
谢了,这个基本值一半的分了
那个vs2008不能显示文字是怎么回事?
耍宝王 2010-07-09
  • 打赏
  • 举报
回复
caption = new char [strlen(_caption)];
应该改成:caption = new char [strlen(_caption) + 1];吧
MHBBCRCPJ 2010-07-09
  • 打赏
  • 举报
回复
人工置顶
MHBBCRCPJ 2010-07-09
  • 打赏
  • 举报
回复
我是这样弄的:
文件->新建->项目->点击 Win32控制台应用程序->名称里填名->确定->下一步->勾选 空项目->完成->右键点击源文件文件夹->添加->新建项->名称里填 main.cpp->添加->把代码粘贴到main.cpp里->生成->生成解决方案->调试->启动调试

哪步错了么?
cattycat 2010-07-09
  • 打赏
  • 举报
回复
我的vs08没有问题,一个文字红快在飘。
从你描述看不是代码问题,是你vs08创建工程的问题,有可能你得加上#include "stdafx.h",或你的main函数是_tmain了。
gz_qmc 2010-07-09
  • 打赏
  • 举报
回复
建议楼主将这句
Label a(0,0,8,2,"abcdefghijklmnop",0x47);
改为
Label a(0,0,8,2,"abcdefghijklmnop\0",0x47);

我觉得你的字串没有结束是个危险
gz_qmc 2010-07-09
  • 打赏
  • 举报
回复
VC正常 一个红色块 块上两排字串"abcdefg" "hijklmn"
红块似乎以x++,y++的速度移动

但要加上:#include <stdlib.h>
如果建立项目的方式不同,还要加上
#include "stdafx.h"

其他一切原封不动.不知道楼主有啥问题
MHBBCRCPJ 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liao05050075 的回复:]
DEV-CPP可以正常编译运行。看到一个abcd的红块在那漂..
[/Quote]
你是没有创建工程直接编译的吧?我没创建工程也很正常.但是如果创建控制台工程然后再添加文件的话在运行的时候会弹出一个XX内存不能为XX的错误提示,但直接运行很正常.
在VS2008里面也有问题,就是不能显示文字,只能显示一个红色的块.
加载更多回复(1)

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧