mdlElmdscr_initOrAddToChain 具体用法帮忙说一下

下面是部分代码
mdlElmdscr_initOrAddToChain
allAutoSymbol 也是MSElementDescr
// 距離によってずれの点を取得する
{
DPoint3d pointSymbol;
MSElementDescr *misFixSymbol = NULL, *misFixSymbolT;
int count = 0, count2 = 0;
uniqueDPoint3dList(&uniqueFixPntsP, fixPntsP);

for(e = allAutoSymbol; e; e = e->h.next){printf("allAutoSymbol\n");}//这个循环是三个
for(e = allAutoSymbol; e; e = e->h.next)
{
mdlCell_extract(&pointSymbol,NULL,NULL,NULL,NULL,NULL,&(e->el));
utilCell_extract(NULL, NULL, NULL, NULL, cellName, MAX_CELLNAME_BYTES, &(e->el));
printf("Element Name --> %s \n", cellName);
printf("pointSymbol eeeeeeeeeeee %.4lf %.4lf %.4lf\n", pointSymbol.x, pointSymbol.y, pointSymbol.z);
isMisFlg = TRUE;
for (nextPntP=uniqueFixPntsP; nextPntP; nextPntP=nextPntP->next)
{
dotDistance = mdlVec_distance(&pointSymbol,&(nextPntP->point));
dotDistance = dotDistance/mdlModelRef_getUorPerMaster(ACTIVEMODEL);
printf("dotDistance %2f\n",dotDistance);
if (dotDistance < _settings.distance) isMisFlg = FALSE;
}
if (isMisFlg == TRUE)
{
mdlElmdscr_initOrAddToChain(&misFixSymbol,e);// 为什么加上这个之后,我的循环多了一个?
}
printf("isMisFlg %d\n",isMisFlg);

}
求大师指点一二。

还有如果IF语句改为下面的
if (isMisFlg == TRUE)
{
mdlElmdscr_duplicateSingle(&misFixSymbolT,e);
mdlElmdscr_initOrAddToChain(&misFixSymbol,misFixSymbolT);
mdlElmdscr_freeAll(&misFixSymbolT);
}
我这个东西成了死循环了。
可有方法破解
已邀请:

liubindobest - IT

赞同来自:

:'(没有人指点啊。
请求大神现身

MicroStation迷

赞同来自:

这个函数就是在第一次调用时可以帮助你先初始化一个元素描述符,第二次以及以后调用时会往这个元素描述符中附加内容。
你的e是一个临时的指针,它被用来遍历allAutoSymbol中的每个元素描述符,不能释放它!

liubindobest - IT

赞同来自:

谢谢老师。
不过可能不是释放的问题,当然内存的释放也是有问题,内存这个问题如果能给一个系统性的资料吗???

回到正题,问题可能出现在MSElementDescr这个复杂的结构上面。
如果循环改为下面的,就可以正常结束了。
nextE = e->h.next;
e->h.next = e->h.previous = NULL;
★如果老师又时间,可否稍微说一下这个结构体。英文的API资料我有。但是这个结构体,突变类型很多。
用的时候有什么注意点。如果有老师的视频资料就更好了。

for(e = allAutoSymbol; e; e = e->h.next){printf("allAutoSymbol\n");}//TODO TEST

for(e = allAutoSymbol; e; e = nextE)
{
nextE = e->h.next;
e->h.next = e->h.previous = NULL;
mdlCell_extract(&pointSymbol,NULL,NULL,NULL,NULL,NULL,&(e->el));
utilCell_extract(NULL, NULL, NULL, NULL, cellName, MAX_CELLNAME_BYTES, &(e->el));
printf("Element Name --> %s \n", cellName);
printf("pointSymbol eeeeeeeeeeee %.4lf %.4lf %.4lf\n", pointSymbol.x, pointSymbol.y, pointSymbol.z);
isMisFlg = TRUE;
for (nextPntP=uniqueFixPntsP; nextPntP; nextPntP=nextPntP->next)
{
dotDistance = mdlVec_distance(&pointSymbol,&(nextPntP->point));
dotDistance = dotDistance/mdlModelRef_getUorPerMaster(ACTIVEMODEL);
printf("dotDistance %2f\n",dotDistance);
if (dotDistance < _settings.distance) isMisFlg = FALSE;
}
if (isMisFlg == TRUE)
mdlElmdscr_initOrAddToChain(&misFixSymbol,e);

printf("isMisFlg %d\n",isMisFlg);
}

liubindobest - IT

赞同来自:

你的e是一个临时的指针,它被用来遍历allAutoSymbol中的每个元素描述符,不能释放它!
↑↑↑↑↑↑↑↑
上面的这句话,能弱弱的问一下吗?
临时指针不也占据内存空间,如果我释放了e,是不是allAutoSymbol也被释放了?其实后面allAutoSymbol我不想要了,我重新把这里面符合的数据放在了_misFixSymbol这个新的链表中。
下面是释放的代码,有什么不妥的地方,还希望再指教一下。
if ( _misFixSymbol != NULL) mdlElmdscr_freeAll(&_misFixSymbol);
if ( misFixSymbol )mdlElmdscr_initOrAddToChain(&_misFixSymbol,misFixSymbol);
if ( _misFixSymbol )ustn_ElmdscrValidate(_misFixSymbol, MASTERFILE);

if ( misFixSymbol ) mdlElmdscr_freeAll(&misFixSymbol);
if ( allAutoSymbol ) mdlElmdscr_freeAll(&allAutoSymbol);
freeDPoint3dList(fixPntsP);
freeDPoint3dList(uniqueFixPntsP);

tianxiaoj123

赞同来自:

misFixSymbol好像不用释放了 因为他已经添加到_misFixSymbol里面了

liubindobest - IT

赞同来自:

> forum.php?mod=redirect&goto=findpost&pid=41339&ptid=9059
misFixSymbol好像不用释放了 因为他已经添加到_misFixSymbol里面了


恩,现在我把这个释放删除了。
但是关于释放关联的知识,还是一知半解。
也许使用多了,见了多了,然后再看看书,会有进展。
有推荐的书吗?{:soso_e100:}

要回复问题请先登录注册