Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.237.15.145] |
|
Сообщ.
#1
,
|
|
|
Самописная функция разбития строки в TStringList. TStringList делается только методом New - при каждом вызове память расходуется.
Было решение: объявить TStringList глобальным - и просто очищать в теле функции. Работало долго - но в одной из программ (именно в одной) заглючило: при повторном вызове функции разрушаются данные в том TStringList, который был возвращен предыдущим вызовом. Как решить проблему NEW в теле функции - при условии, что функция должна именно возвращать TStringList? TStringList * _fastcall TForm_Main::slSplit(const AnsiString asString, const AnsiString asSeparator) //В билдере отсутствует функция Split. { AnsiString asTemp_Local = ""; for (int iTemp=0; iTemp<asString.Length(); iTemp++) asTemp_Local = asTemp_Local + asString.SubString(iTemp+1,1); //Чтобы не портить саму вызываемую asString. //StrCopy(asTemp_Local.c_str(), asString.c_str()); //Эта дрянь не работает на длинных строках, разрушая память, - эту ошибку искал часов 5. char *cString = asTemp_Local.c_str(), *cTok = NULL; const char *cSeparator = asSeparator.c_str(); [B]TStringList *slResult = new TStringList;[/B] for (cTok = strtok(cString, cSeparator); cTok; cTok = strtok(NULL, cSeparator)) slResult->Add(Trim((AnsiString)cTok)); return slResult; } |
Сообщ.
#2
,
|
|
|
"объявить TStringList глобальным" - единственное решение.
|