请问出现这样的问题该怎么办啊??????????拜托,一定要帮忙啊
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,AcDbObjectIdpLayerId)
{
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;
}
前面声明void createNewGroup(); 时就应该把参数也写上啊!
你程序第四行应该写成void creatNewGroup(AcDbObjectIdArray & objIds,char *pGroupName,AcDbObjectIdpLayerId);这样程序编译才能通过啊!
你前面声明是void createNewGroup(); 后面函数定义又带有三个参数,编译时当然会告诉你“createNewGroup' : function does not take 3 parameters ”啦!
谢谢,但是又有新问题了
啊又有了新的错误啊
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)
程序错误原因:
本帖最后由 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++的问题不妨到“源码分析”区提问。
多谢,多谢
实在是太感谢了你救了我一命啊
页:
[1]