明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1623|回复: 4

请问出现这样的问题该怎么办啊??????????拜托,一定要帮忙啊

[复制链接]
发表于 2003-5-26 17:02:00 | 显示全部楼层 |阅读模式
Compiling...
entity.cpp
C:\Program Files\ACAD2000\adsrx\sample\entity\entity.cpp(93) : error C2660: 'createNewGroup' : function does not take 3 parameters

一定要救我啊
我只有一天时间了
程序如下:AcDbObjectId createNewLine();
AcDbObjectId createNewCircle();
AcDbObjectId createNewLayer();
void createNewGroup();
Acad::ErrorStatus changeColor(AcDbObjectId,Adesk::UInt16);
AcDbObjectId
createNewLine()
{
        AcGePoint3d startPoint(5.0,4.0,0.0);
        AcGePoint3d endPoint(15.0,10.0,0.0);
        AcDbLine *pLine=new AcDbLine(startPoint,endPoint);
        AcDbBlockTable *pBlockTable;
        acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable,AcDb::kForRead);
        AcDbBlockTableRecord *pBlockTableRecord;
        pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
        pBlockTable->close();
        AcDbObjectId lineId;
        pBlockTableRecord->appendAcDbEntity(lineId,pLine);
        pBlockTableRecord->close();
        pLine->close();
        return lineId;
}
AcDbObjectId
createNewCircle()
{
        AcGePoint3d center(10.0,7.0,0.0);
        AcGeVector3d normal(0.0,0.0,1.0);
        AcDbCircle *pCirc=new AcDbCircle(center,normal,4.5);
        AcDbBlockTable *pBlockTable;
        acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable,AcDb::kForRead);
        AcDbBlockTableRecord *pBlockTableRecord;
        pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
        pBlockTable->close();
        AcDbObjectId circleId;
        pBlockTableRecord->appendAcDbEntity(circleId,pCirc);
        pBlockTableRecord->close();
        pCirc->close();
        return circleId;
}
AcDbObjectId
createNewLayer()
{
        AcDbLayerTable *pLayerTable;
        acdbHostApplicationServices()->workingDatabase()
                ->getSymbolTable(pLayerTable,AcDb::kForWrite);
        AcDbLayerTableRecord *pLayerTableRecord=new AcDbLayerTableRecord;
        pLayerTableRecord->setName("MYNewLayer");
        AcDbObjectId pLayerId;
        pLayerTable->add(pLayerId,pLayerTableRecord);
        pLayerTable->close();
        pLayerTableRecord->close();
        return pLayerId;
}
void
creatNewGroup(AcDbObjectIdArray & objIds,char *pGroupName,AcDbObjectId  pLayerId)
{
        AcDbGroup *pGroup=new AcDbGroup(pGroupName);
        for(int i=0;i<objIds.length();i++){
                pGroup->append(objIds);
        }
        AcDbDictionary *pGroupDict;
        acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict,AcDb::kForWrite);
        AcDbObjectId pGroupId;
        pGroupDict->setAt(pGroupName,pGroup,pGroupId);
        pGroup->setLayer(pLayerId);
        pGroupDict->close();
        pGroup->close();
}
Acad::ErrorStatus
changeColor(AcDbObjectId entId,Adesk::UInt16 newColor)
{
        AcDbEntity *pEntity;
        acdbOpenObject(pEntity,entId,AcDb::kForWrite);
        pEntity->setColorIndex(newColor);
        pEntity->close();
        return Acad::eOk;
}
void
runIt()
{
        AcDbObjectId newLayerId=createNewLayer();
        AcDbObjectIdArray idArray;
        idArray.append(createNewLine());
        idArray.append(createNewCircle());
        changeColor(idArray.first(),1);
        changeColor(idArray.last(),3);
        createNewGroup(& idArray,"MyNewGroup",newLayerId);
}
void
initApp()
{
        acedRegCmds->addCommand("ASDK_MAKE_ENTITIES","MSDK_MakeNewEnts","MakeNewEnts",ACRX_CMD_MODAL,runIt);
}
void
unloadApp()
{
        acedRegCmds->removeGroup("ASDK_MAKE_ENTITIES");
}
extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg,void* appId)
{
        switch (msg){
        case AcRx::kInitAppMsg:
                        acrxDynamicLinker->unlockApplication(appId);
                        acrxDynamicLinker->registerAppMDIAware(appId);
                        initApp();
                        break;
        case AcRx::kUnloadAppMsg:
                unloadApp();
        }
                return AcRx::kRetOK;
}
发表于 2003-5-26 22:34:00 | 显示全部楼层

前面声明void createNewGroup(); 时就应该把参数也写上啊!

你程序第四行应该写成void creatNewGroup(AcDbObjectIdArray & objIds,char *pGroupName,AcDbObjectId  pLayerId);
这样程序编译才能通过啊!

你前面声明是void createNewGroup(); 后面函数定义又带有三个参数,编译时当然会告诉你“createNewGroup' : function does not take 3 parameters ”啦!
 楼主| 发表于 2003-5-27 09:41:00 | 显示全部楼层

谢谢,但是又有新问题了


又有了新的错误啊
C:\Program Files\ACAD2000\adsrx\sample\entity\entity.cpp(93) : error C2065: 'createNewGroup' : undeclared identifier
Error executing cl.exe.

entity.arx - 1 error(s), 0 warning(s)
发表于 2003-5-27 11:17:00 | 显示全部楼层

程序错误原因:

本帖最后由 leeyeafu 于 2003-5-27 11:16:32 编辑

第一,createNewGroup()函数声明与调用拼写不一致。你将该函数声明为void creatNewGroup(),而调用时用createNewGroup(),差一个字母e。不幸的是,你在程序开头将createNewGroup()函数声明为无参数的,再次写该函数的实现时,想要为该函数增加一个重载版本,但拼写错误使系统在调用时,只能找到无参数的函数版本,从而编译系统报告该函数不能使用三个参数。
第二,修改拼写错误后,编译仍有问题,系统报告第一个参数不能进行参数类型转换。这个错误大概是因为你对C++函数调用时参数传递机制的理解还有偏差。参数&idArray实际上只是一个AcDbObjectIdArray类型的指针,它不能转换为对AcDbObjectIdArray的地址引用。我将你的runIt()函数改写成这样:
void runIt()
{
  AcDbObjectId newLayerId=createNewLayer();
  AcDbObjectIdArray* idArray=new AcDbObjectIdArray();
  idArray->append(createNewLine());
  idArray->append(createNewCircle());
  changeColor(idArray->first(),1);
  changeColor(idArray->last(),3);
  createNewGroup(*idArray,"MyNewGroup",newLayerId);
}
以上代码在VC6和VC++.NET中编译通过,且无任何警告信息。请注意我做的几处改动:
1、将idArray声明为指针。并用new运算符调用类AcDbObjectIdArray的构造函数给指针初始化。虽然VC编译系统并不要求你必须这样做,但一个未初始化的指针可能给程序带来的隐患不知你是否理解。关于这一点,一般高级点的C/C++教程应该都会提到。
2、既然idArray为指针,调用AcDbObjectIdArray类的成员函数就应该用 -> 运算符代替 . 运算符。
3、createNewGroup()函数的第一个参数用*idArray来传递数组的首地址。
要写好ARX程序,希望你能真正理解以上改动的必然性和其中的原理。有什么问题可以再发帖子询问。不过,有关C/C++的问题不妨到“源码分析”区提问。
 楼主| 发表于 2003-5-27 14:19:00 | 显示全部楼层

多谢,多谢

实在是太感谢了
你救了我一命啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 14:50 , Processed in 0.166118 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表