mdlScanCriteria_scan 扫描删除时 系统异常

我用 mdlScanCriteria_scan进行扫描,符合条件的CELL进行删除,可是在
scanStatus = mdlScanCriteria_scan(pScanCriteria, (void *) scanBuffer, &acceptSize, &scanPosition);
这里,一直出现异常信息,然后自己就大一个异常log,然后死翘翘了。

问题%%%%%
这种情况下一般是什么原因?难道是我的DGN文件上的元素不对吗?
看了原来的一些帖子,感觉没有相似的,可能我这个问题比较简单,
希望老师们稍微看一眼。Thank you。

———————————————————————————————————————————————————————————————
代码:
mdlModelRefIterator_create(&iterator, MASTERFILE, MRITERATE_Root|MRITERATE_PrimaryChildRefs|MRITERATE_ExtendedChildRefs, -1);
while ((modelRef = mdlModelRefIterator_getNext(iterator)) != NULL)
{
if (mdlModelRef_isReference(modelRef))
{ mdlRefFile_getParameters(&refInf,REFERENCE_SLOTACTIVE, modelRef);
if (refInf != 1) continue;
mdlRefFile_getParameters(&refInf,REFERENCE_DISPLAY, modelRef);
if (refInf != 1) continue;
mdlRefFile_getParameters(&refInf,REFERENCE_LOCATE, modelRef);
if (refInf != 1) continue;
}

if (!(pScanCriteria = mdlScanCriteria_create())) continue;

mdlScanCriteria_setModel(pScanCriteria, modelRef);
mdlScanCriteria_setReturnType(pScanCriteria, MSSCANCRIT_RETURN_FILEPOS, FALSE, TRUE);
memset (&extAttrBuf, 0, sizeof(ExtendedAttrBuf));
mdlScanCriteria_setAttributeTest(pScanCriteria, 0, 0, &extAttrBuf);
mdlScanCriteria_setDrawnElements(pScanCriteria);
if (view >= 0 && view <= 7)
{
mdlScanCriteria_setViewLevelTest(pScanCriteria, view, modelRef);
mdlScanCriteria_setViewRangeTest (pScanCriteria, view, modelRef);
}
memset(typeMaskArray, 0, sizeof(typeMaskArray));
typeMaskArray = TMSK0_CELL_HEADER;
mdlScanCriteria_setElementTypeTest(pScanCriteria, typeMaskArray,sizeof(typeMaskArray));

cache = mdlModelRef_getCache(modelRef);
filePos = dgnCache_getGraphicElmStart(cache);
mdlScanCriteria_setStartFilePos(pScanCriteria, filePos);

do
{ acceptSize = sizeof (scanBuffer) / sizeof (short);
scanStatus = mdlScanCriteria_scan(pScanCriteria, (void *) scanBuffer, &acceptSize, &scanPosition);
.........
———————————————————————————————————————————————————————————————
异常:
359. G40CONTEXTMENU_HISTORY : user = C:\Users\syspro\AppData\Local\Temp\SYSPRO\S-CAD6.0.0\G40ContextMenu.ini

CExpression evaluation history:
ACCUDRAW adrawDlog.string 15:10:04.355
PSELECT powerSelectInfo.prefs.selectControls 15:10:01.485
PSELECT powerSelectInfo.prefs.selectControls 15:10:01.485
PSELECT powerSelectInfo.prefs.selectControls 15:10:01.475
PSELECT powerSelectInfo.prefs.selectControls 15:10:01.475
PSELECT powerSelectInfo.prefs.selectControls 15:10:01.475
PSELECT powerSelectInfo.prefs.disableControls 15:10:01.475
PSELECT powerSelectInfo.prefs.currMode 15:10:01.475
PSELECT powerSelectInfo.prefs.currSelBy 15:10:01.475


Exception String: 'Access Violation'


已邀请:

MicroStation迷

赞同来自:

问题1. 你的modelRef会是参考文件吗?参考文件中的元素是不能直接删除的。
问题2. 最好不要在scan中嵌套删除和增加的功能,因为这个scan是会随着你删除和添加元素的变化而返回不同的结果的。比如,如果你在scan中去增加一个能满足你搜索规则的元素,则下次scan就会找到你这个新增元素,然后又增加一个新元素。这样会造成死循环的。
最好的解决方法是,先将scan的所有结果(如FilePos)保存到一个vector中,或一个数组中。等scan完全结束后再用一个循环对结果元素意义处理即可。

liubindobest - IT

赞同来自:

> forum.php?mod=redirect&goto=findpost&pid=42171&ptid=9275
问题1. 你的modelRef会是参考文件吗?参考文件中的元素是不能直接删除的。
问题2. 最好不要在scan中嵌套删 ...


谢谢迷老师如此快速的解答。真的非常感谢。
1,有可能是参考文件。
2,恩,我用你说的结果集合再试一试。
3 , 如果你在scan中去增加一个能满足你搜索规则的元素,则下次scan就会找到你这个新增元素,然后又增加一个新元素。这样会造成死循环的。
------上面的这句话不是很理解。这样的结果是耗尽内存吗。我对于这个满足条件的点,确实是想,先删除原来的CELL,在再这个点上加上一个CELL。
下次再SCAN的时候,还是删除后再增加。
这里,能稍微说明一些上面的意思吗?


MicroStation迷

赞同来自:

不是会耗尽内存,但是会造成死循环,因为你不断地增加元素,而scan的while条件总是不能得到满足从而不会结束。

要回复问题请先登录注册