char* 和CString 很郁闷的问题

fly___fly 2008-07-24 08:53:27
getName函数声明如下:
Acad::ErrorStatus getName(const char*& pName) const;
Acad::ErrorStatus getName(char*& pName) const;

我这么写有时候能正常运行,有时候却明明p有值,str没有值

CString str;
char* p = str.GetBuffer(0);
blkTblRecPtr->getName(p);

str.ReleaseBuffer();

不能正常运行的时候换成下边的代码却能运行正常,p和str都有值。

CString str;
char* p = str.GetBuffer(0);
char* pTemp;
blkTblRecPtr->getName(p);

strcpy(p, pTemp);
str.ReleaseBuffer();


请高手解惑
...全文
131 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenlian2009 2012-05-13
  • 打赏
  • 举报
回复
AcDbLayerTableRecordPointer是什么啊,需要加什么头文件啊
冷月清晖 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fly___fly 的回复:]
换成一楼那样子是不错的。只是。不明白
[/Quote]
//假设 char * q=strRecName.GetBuffer(0);
//getname 改变了p的值并将它指向name值,也就是p不再指向strRecName.GetBuffer(0);了,p!=q;
//strRecName当然没有值
xkyx_cn 2008-07-24
  • 打赏
  • 举报
回复
CString::GetBuffer只是获取CString对象字符缓冲区的指针,如果用它来操作,就必须如同C处理字符串的一样操作

fly___fly 2008-07-24
  • 打赏
  • 举报
回复
这两个调用GetName的指针所属类拥有共同的基类,GetName调用的是那个基类的函数。

这个函数的声明如下:
Acad::ErrorStatus getName(char*& pName) const;
Acad::ErrorStatus getName(const char*& pName) const;

hai040 2008-07-24
  • 打赏
  • 举报
回复
哦,不是,如果2能行的话,应该是getName修改了p(可能重新new了空间)
hai040 2008-07-24
  • 打赏
  • 举报
回复
char* p = str.GetBuffer(0);
blkTblRecPtr->getName(p);
可能是空间不够,GetBuffer(0)buffer的大小应该是str的原大小
fly___fly 2008-07-24
  • 打赏
  • 举报
回复
换成一楼那样子是不错的。只是。不明白
fly___fly 2008-07-24
  • 打赏
  • 举报
回复

AcDbLayerTableRecordPointer layerTblRecPtr(layerId, AcDb::kForRead);

CString strLayerName;
char* pLayerName = strLayerName.GetBuffer(0);
layerTblRecPtr->getName(pLayerName);
strLayerName.ReleaseBuffer();


上面代码运行时出错。



AcDbBlockTableRecordPointer blkTblRecPtr(recId, AcDb::kForRead);
CString strRecName;
char* pTemp = strRecName.GetBuffer(0);

if (blkTblRecPtr->getName(pTemp) != Acad::eOk)
{
strRecName.ReleaseBuffer();

return false;
}

strRecName.ReleaseBuffer();


上述代码运行时正确。
Acad::ErrorStatus getName(char*& pName) const;
Acad::ErrorStatus getName(const char*& pName) const;
getName()都是这样子。

不明白。

xkyx_cn 2008-07-24
  • 打赏
  • 举报
回复
如果这样用会有什么问题吗?

[Quote=引用 6 楼 fly___fly 的回复:]
如一楼所示
[/Quote]
fly___fly 2008-07-24
  • 打赏
  • 举报
回复
如一楼所示
fly___fly 2008-07-24
  • 打赏
  • 举报
回复
下边是写错了。。应该如二楼所示的。。
sunhuanwen 2008-07-24
  • 打赏
  • 举报
回复
恩,2是写错了吧
你的目的不是要把pTemp, 通过getName取得值,然后 copy到p中吗?

1就是鱼说的那样
冷月清晖 2008-07-24
  • 打赏
  • 举报
回复
getName(char*& pName)

我看它是指针的引用,在函数内部估计做了些改变指针值的操作
冷月清晖 2008-07-24
  • 打赏
  • 举报
回复
要看blkTblRecPtr->getName干了啥操作
xkyx_cn 2008-07-24
  • 打赏
  • 举报
回复
上面的情况只是改变了指针p,但所指向的内容却没有copy到str中

你下面是不是写错了,应该是:

CString str;
char* p = str.GetBuffer(0);
char* pTemp;
blkTblRecPtr->getName(pTemp);

strcpy(p, pTemp);
str.ReleaseBuffer();

64,637

社区成员

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

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