Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26163
Рейтинг: 2127
#31: 2010-09-11 01:23:59 ЛС | профиль | цитата
Tad писал(а):
А ведь в моем макете был одиночный символ

Будет одиночный символ
------------ Дoбавленo в 01.23:
Млин... Все примеры переписывать надо
------------ Дoбавленo в 01.23:
А что народ скажет, у кого строковый парсер работать не будет, сожрут же
Будут орать -- раньше работало, а теперь не работает, верните взад, все что вы тут натворили, а то схемы править надо, а это очень проблематично и тд, в том же ракурсе

карма: 22

0
Ответов: 16884
Рейтинг: 1239
#32: 2010-09-11 01:33:39 ЛС | профиль | цитата
nesco писал(а):
А что народ скажет
У вас показывают рекламу "А вы попробуйте !" и посмотрим сколько человек заорут. Даже если 10 и то ничего сташного, но думаю, что и десятка не наберётся.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#33: 2010-09-11 01:38:59 ЛС | профиль | цитата
Tad писал(а):
что и десятка не наберётся

А вони будет, как от сотни

карма: 22

0
Ответов: 356
Рейтинг: 31
#34: 2010-09-11 02:26:12 ЛС | профиль | цитата
[offtop]Интересно, как в таких случаях поступают в аналогах
Или там какую версию компонента поставил, та и будет стоять [/offtop]
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#35: 2010-09-11 02:38:31 ЛС | профиль | цитата
olDjeka писал(а):
Или там какую версию компонента поставил, та и будет стоять

Каких аналогах
Какую оставишь, та и будет, до первого обновления или выхода нового релиза
карма: 22

0
Ответов: 356
Рейтинг: 31
#36: 2010-09-11 02:57:40 ЛС | профиль | цитата
[offtop]Аналоги - нижний абзац.
olDjeka писал(а):
Или там
читать как Или в аналогах.[/offtop]
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#37: 2010-09-11 03:05:13 ЛС | профиль | цитата
Dilma писал(а):
через ф-цию GetTok

Млин... Только сейчас заметил рекомендации. Но, все же, я так и не понял, чем лучше метод GetTok того, что сейчас есть Он использует нерациональный метод поиска Pos, который совершенно не оптимизирован на работу с одним символом поиска, в отличии от StrScan, который и работает именно с одним символом, да и код у Pos, гораздо больше, чем у StrScan
------------ Дoбавленo в 03.04:
olDjeka, понятия не имею, как там поступают. Но я знаю, как поступают у Мелкомягких -- для достижения нужного результата, клали они на всех пользователей, и на совместимость, впридачу


------------ Дoбавленo в 03.05:
Короче, оставил пока "как есть" но только оптимизировал под один символ
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#38: 2010-09-11 03:28:01 ЛС | профиль | цитата
nesco писал(а):
в отличии от StrScan, который и работает именно с одним символом, да и код у Pos, гораздо больше, чем у StrScan

замеры имеются?

nesco писал(а):
для достижения нужного результата, клали они на всех пользователей, и на совместимость, впридачу

Microsoft как раз прилагает очень много усилий для сохранения совместимостей. Из-за этого у них столь замусоренные операционки и API получаются. Но зато у пользователя никаких проблем при смене ОС практически не бывает.
карма: 27
0
Ответов: 16884
Рейтинг: 1239
#39: 2010-09-11 09:38:49 ЛС | профиль | цитата
nesco, насчет тормозов в Pos ты прав только частично.
Pos бежит себе по строке, как в том анекдоте[flood]
Анекдот писал(а):
Съездил грузин в гости в Москву. Вернулся. Ну все друзья
- Рассказывай, как в Москве.
- Большая. Людей много. На балет ходил.
- А балет, это что ?
- Понимаешь. Сцена. Он один, а женщин много. Музыка. Он женщину поднял, понюхал, бросил. Поднял, понюхал, бросил. Поднял, понюхал и понес со сцены
[/flood]совпало, вернул номер позиции

Ныряем в теорию.
Вот примитивно прокомментировал GetTok

#pas
function GetTok(var s:string; const c:char):string; // в s получаем указатель на исходную строку и символ
var p:integer;
begin
p := Pos(c,s); // получаем позицию вхождения
if p > 0 then // есть вхождение
begin
Result := Copy(s,1,p-1); // создаётся новая строка с указателем в Result и длиной p-1
if p = Length(s) then // проверяем на конец строки
s := ' // Да, конец - переносим признак конца строки
// на место первого символа
// и указатель на пустую строку автоматом уничтожается
else Delete(s,1,p); // не конец: СМЕЩАЕМ (ПЕРЕЗАПИСЫВАЕМ) ВСЮ СТРОКУ от найденого Pos до конца строки-
//вот это основной тормоз. Указатель на строку отстается прежний
end
else Result := s; //нет вхождения. В Result значение указателя исходной строки.
end;
Delete gри длинной строке тормоз ещё тот.
Вывод:
1. Вместо Pos применить PosEx
2. Исключить Delete
3. Применить только Copy (никуда не денешься - результат то нужен. )

Или отказаться от парсинга текста длинной в 400 Mb


карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#40: 2010-09-11 11:56:19 ЛС | профиль | цитата
Опять я не могу понять -- StrScan не мо функция, а Кладова, я ее просто поскипал из исправленной версии KOL-a, которй у нас нет
И, ИМХО, описание на нее дает исчерпывающий ответ


function StrScan(Str: PChar; Chr: Char): PChar;
{* Fast search of given character in a string. Pointer to found character (or nil) is returned. }


И чем функция


function FParse(var S: string; const Delimiters: char): string;
var
Pos : Integer;
I, J : Integer;
P, F: PChar;
begin
P := PChar(S);
Pos := -1;
F := StrScan(P, Delimiters);
J := -1;
if F <> nil then
J := Integer(F) - Integer(P) + 1;
if (J > 0) and ((Pos < 0) or (J < Pos)) then Pos := J;
Result := S;
if Pos <= 0 then Pos := Length(S) + 1;
S := CopyEnd(Result, Pos + 1);
Result := Copy(Result, 1, Pos - 1);
end;

сильно отличается от GetTok, и нет никакого Delete Кстати, сама функция FParse сделана на базе кода из KOL-a
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#41: 2010-09-11 13:15:17 ЛС | профиль | цитата
nesco, я против применения StrScan и Fparse вместо GetTok ничего не имею. Я уже всё это смотрел и тоже думаю, что будет работать намного быстрее.
Уже это const Delimiters: char однозначно.
------------ Дoбавленo в 13.15:
nesco писал(а):
И чем функция... сильно отличается от GetTok
отличается кодами.
nesco, а прокомментировать function FParse слабо.
хотябы это

   Pos := -1;
.....
J := Integer(F) - Integer(P) + 1;
if (J > 0) and ((Pos < 0) or (J < Pos)) then Pos := J;
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#42: 2010-09-11 13:46:11 ЛС | профиль | цитата
Tad писал(а):
а прокомментировать function FParse слабо

А попробуй сам прокомментировать. Этот код я поскипал с KOL, разбираться сильно не стал, но похоже, после переделки под один символ, вот это можно убрать -- and ((Pos < 0) or (J < Pos))
------------ Дoбавленo в 13.46:
Tad, вот так попробуй


//---------------- Функция обратного парсирования строки ----------------------- 

function RParse(var S: string; const Delimiters: char): string;
var
I, Pos: integer;
P, F: PChar;
begin
P := PChar(S);
F := StrRScan(P, Delimiters);
if F <> nil then
begin
Pos := Integer(F) - Integer(P);
if Pos <= 0 then Pos := -1;
end
else
Pos := -1;
Result := S;
S := Copy(Result, 1, Pos);
Result := CopyEnd(Result, Pos + 2);
end;

//------------------------------------------------------------------------------
//
//------------ Исправленная функция прямого парсирования строки ----------------
function FParse(var S: string; const Delimiters: char): string;
var
I, Pos: Integer;
P, F: PChar;
begin
P := PChar(S);
F := StrScan(P, Delimiters);
if F <> nil then
begin
Pos := Integer(F) - Integer(P) + 1;
if Pos <= 0 then Pos := Length(S) + 1;
end
else
Pos := Length(S) + 1;
Result := S;
S := CopyEnd(Result, Pos + 1);
Result := Copy(Result, 1, Pos - 1);
end;

//------------------------------------------------------------------------------
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#43: 2010-09-11 16:18:02 ЛС | профиль | цитата
nesco, сначала пару вопросов

#pas
function FParse(var S: string; const Delimiters: char): string;
var
I, Pos: Integer;
P, F: PChar;
begin
P := PChar(S);
F := StrScan(P, Delimiters);
if F <> nil then
begin
Pos := Integer(F) - Integer(P) + 1;
if Pos <= 0 then Pos := Length(S) + 1; //Когда сработает эта строка если if F <> nil ?
end
else
Pos := Length(S) + 1; // ??
Result := S;
S := CopyEnd(Result, Pos + 1);
Result := Copy(Result, 1, Pos - 1);
end;
------------ Дoбавленo в 16.18:
nesco, штатный GetTok заремал, а вот это хзяйство загнал в Share.pas

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function StrScan(Str: PChar; Chr: Char): PChar; assembler;
asm
PUSH EDI
PUSH EAX
MOV EDI,Str
OR ECX, -1
XOR AL,AL
REPNE SCASB
NOT ECX
POP EDI
XCHG EAX, EDX
REPNE SCASB

XCHG EAX, EDI
POP EDI

JE @@1
MOV EAX,1
@@1: DEC EAX
end {$IFDEF F_P} [ 'EAX', 'EDX', 'ECX' ] {$ENDIF};

function GetTok(var S: string; const c: char): string;
var
I, Pos: Integer;
P, F: PChar;
begin
P := PChar(S);
F := StrScan(P, c);
if F <> nil then
begin
Pos := Integer(F) - Integer(P) + 1;
if Pos <= 0 then Pos := Length(S) + 1;
end
else
Pos := Length(S) + 1;
Result := S;
S := CopyEnd(Result, Pos + 1);
Result := Copy(Result, 1, Pos - 1);
end;
(В твоих компонентах FParse заменил на GetTok)
Погонял маленько - вроде полет нормальный
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 4698
Рейтинг: 426
#44: 2010-09-11 16:31:06 ЛС | профиль | цитата
nesco писал(а):
А что народ скажет, у кого строковый парсер работать не будет, сожрут же
Будут орать -- раньше работало, а теперь не работает, верните взад, все что вы тут натворили, а то схемы править надо, а это очень проблематично и тд, в том же ракурсе

Я первый на очереди, буду орать за тыщу, у меня уже схем с делиметром
ужас сколько накопилось (тот же GE_Ball на нем построен), так что не надо этих хухры мухры с Delimetr:char, только STRING это однозначно! А то я на вас обижусь и напишу свой компонент
карма: 10
0
Ответов: 16884
Рейтинг: 1239
#45: 2010-09-11 16:35:39 ЛС | профиль | цитата
Assasin писал(а):
у меня уже схем с делиметром
Это в каких же компонентах ты их применяешь ? Конкретно.
Assasin писал(а):
А то я на вас обижусь и напишу свой компонент
зачем писать - сохрани старьё пока не выбросили на помойку
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)