Тема: Способы работы со строками
Доброго времени суток, Знатоки!
Последнее время сталкиваюсь с тем, что операции со строками происходят непредсказуемо.
Есть задача: при удалении объектов необходимо среди оставшихся найти те, у которых в расширенных данных в имени приложения содержится строчка типа "Some text ... handle", где handle - это AcDbHandle удаленного объекта, преобразованный в char или ACHAR.
вот я делаю - создаю массив HandleArray типа AcArray <string>
void DbReactor::objectErased(const AcDbDatabase * dwg, const AcDbObject * dbObj, Adesk::Boolean pErased) { AcDbBlockReference *pInsert=AcDbBlockReference::cast(dbObj); if (!pInsert) { acutPrintf("\nРассматриваемый объект не является блоком!-выход из реактора на удаление!"); return; } string cstr; AcDbHandle h; char *strh=new char; resbuf *pRB; pRB=pInsert->xData(NULL); if (pRB!=NULL) { pInsert->getAcDbHandle(h); if (h.isNull()!=false) acutNewBuffer(strh,17); h.getIntoAsciiBuffer(strh); cstr.append("Точки привязки для объекта "); cstr.append(strh); {DocVars.docData().HandleArray.append(cstr); acutPrintf("\nОпределили родительский объект и записали хэндл в массив:");} } if (pRB)acutRelRb(pRB); acutDelString(strh); cstr.clear(); if(pInsert)pInsert=NULL; }
Затем иду читать:
void EdReactor::commandEnded(const char * cmdStr) { int i; long j=0; SaveLayerLockState(); j=DocVars.docData().HandleArray.length(); for (i=0;i<j;i++) { acutPrintf("\nСтрока handleов: %d , содержимое: %s",i,DocVars.docData().HandleArray.at(i).c_str()); SSCreate(DocVars.docData().HandleArray.at(i).c_str()); } RestoreLayerLockState(); return; }
Далее происходит создание набора по фильтру с расш. данными, и удаление всего ранее неудаленного, которое попало в этот набор. Проблема возникает периодически:
вылетает AutoCAD на попытке сформировать набор по фильтру с расш. данными из-за ошибочного прочтения части записей созданного массива. Проблема возникает, когда удаляется сразу большое количество объектов. Например, записал я в массив строчку: Точки привязки для объекта 7B5C7, а читается T_1T_1ивязки для объекта 7B5C7. Вылетает (AutoCAD2005, MSVS 2002). Этой проблемы не возникает при операциях с небольшим количеством объектов немного раз.
Какими классами и методами пользуются для работы со строками
(формирование строковых массивов, запись/чтение, преобразование в char* для передачи как аргумента в функции ObjectARX и т.д.)? Из-за чего вылетает? как такие проблемы решаются?