Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.19;
Скачать: CL | DM;

Вниз

Pos и дин. массив   Найти похожие ветки 

 
Kent25791   (2006-10-30 20:50) [0]

Всем привет. Может ли функция pos искать строку в ДИНАМИЧЕСКОМ массиве? если да как это сделать?


 
Джо ©   (2006-10-30 20:56) [1]

var
 A: array of Char;
...
Pos ("abc",string(A))


 
Kent25791   (2006-10-30 21:50) [2]

А без string можно сделать? Мне важно быстродействие.


 
Орион ©   (2006-10-30 21:53) [3]

> [2] Kent25791   (30.10.06 21:50)

сам-то понял что сказал?


 
KilkennyCat ©   (2006-10-30 21:54) [4]

Посмотреть реализацию Pos и подумать.


 
Kent25791   (2006-10-30 21:57) [5]

Т.е. я хотел сказать чтo  конвертирование в AnsiString — операция дорогостоящая в смысле процессорного времени.


 
Орион ©   (2006-10-30 21:58) [6]

> [5] Kent25791   (30.10.06 21:57)

где там конвертирование в AnsiString?


 
Kent25791   (2006-10-30 22:01) [7]

>> сам-то понял что сказал?

Пожалуйста, давайте будем без этой быкотни и задирания носа.
Я прекрасно оснознаю и могу ответить за свои слова.
Программирую давно, на делфи перешел недвано.
Ответьте по теме.


 
Kent25791   (2006-10-30 22:01) [8]

>> где там конвертирование в AnsiString?
string(A)


 
Kent25791   (2006-10-30 22:05) [9]

Pos без проблем проглатывает статические массивы. Но как с динамическими?
Можно кончено объявить как array [0..0], а затем выделять память или использовать Pchar тогда все будет в порядке.
Но есть ли вариант с дин массивами?


 
Джо ©   (2006-10-30 22:13) [10]

> [8] Kent25791   (30.10.06 22:01)
> >> где там конвертирование в AnsiString?
> string(A)

Это НЕ конвертирование. Это преобразование типа.


 
@!!ex ©   (2006-10-30 22:15) [11]


> Kent25791   (30.10.06 22:01) [8]

И где тут конвертирование? :))
Тоесть выделяется новая память, туда копируются преобразованные значения.... Да? :)

А я всегда думал, что это - приведение типов........
очень быстрая операция.....


 
Джо ©   (2006-10-30 22:23) [12]

> [11] @!!ex ©   (30.10.06 22:15)
> очень быстрая операция.....

... которая даже не транслируется в машинный код.


 
Leonid Troyanovsky ©   (2006-10-30 22:29) [13]


> Джо ©   (30.10.06 22:13) [10]

> > string(A)

> Это НЕ конвертирование. Это преобразование типа.

Чего-то мне сомнительно.
Нет бы  - наоборот.

--
Regards, LVT.


 
Джо ©   (2006-10-30 22:33) [14]

> [13] Leonid Troyanovsky ©   (30.10.06 22:29)
> Чего-то мне сомнительно.
> Нет бы  - наоборот.

Что "наоборот"?


 
Орион ©   (2006-10-30 22:34) [15]

> [7] Kent25791   (30.10.06 22:01)

Я всегда за. Если бы вы сформулировали вопрос так: "А string(A) не повлияет на быстродействие? Это случайно не конвертирование в AnsiString?", то и ответ последовыл бы совершенно другой ;)


 
Kent25791   (2006-10-30 22:42) [16]

>> очень быстрая операция.....
Вы в этом уверены? В свое время я на это потратил достаточно времени .Смотрите что будет в данном случае:
Массив - от 4096 - до 1073741824 байт.
преобразование в string :
Компилятор выделяет память из кучи и копирует  все туда (раз)
Дальше самое интересное,:
в функиции pos  при использовании строки добавляется скрытый блок try finally.
Сразу предвижу вопросы, сразу объясню:
Так как компилятор будет считать что значение возможно будет изменяться , поэтому вводит скрытую локальную переменную для хранения строки (два).
Вначале выполнения функции счетчик ссылок будет увеличен на 1, в конце уменьшен на 1. Чтобы гарантировать что значение счетчика всегда будет уменьшаться компилятор и втсавляет этот скрытый блок try finally.(три)

Все вместе взятое снизит быстродействие в несколько раз.

Думал вы знаете о чем я говорил. как оказалось не все...


 
Anatoly Podgoretsky ©   (2006-10-30 22:43) [17]

string(A) это конечно трюк, основанный на некотором подобии структур, а вот StrPos уже не трюк.


 
@!!ex ©   (2006-10-30 22:58) [18]


> Kent25791   (30.10.06 22:42) [16]

То есть операция string(A) приведет к копированию данных по вашему? :))


 
Leonid Troyanovsky ©   (2006-10-30 23:00) [19]


> Джо ©   (30.10.06 22:33) [14]

> Что "наоборот"?


procedure TForm1.Button1Click(Sender: TObject);
var
 p : array [0..255] of Char;
begin
 StrCopy(p, "0123456789");
 Caption := Format("%x <> %p", [Longint(@p[0]), Pointer(String(p))]);
end;


--
Regards, LVT.


 
Джо ©   (2006-10-30 23:19) [20]

> [19] Leonid Troyanovsky ©   (30.10.06 23:00)


p : array [0..255] of Char;
Уберите выделенное.


 
PVOzerski ©   (2006-10-30 23:24) [21]

Сейчас под руками нет Delphi. На FPC сработало вот такое:

var
 s: array of char;
begin
 s := "123ABCD890";
 writeln(pos("ABC", PChar(@s[0])));
end.

Но вот что будет, если s = nil? С FPC всё нормально, в Delphi может отличаться реализация Pos.


 
Kent25791   (2006-10-30 23:34) [22]

>> То есть операция string(A) приведет к копированию данных по вашему? :))
А вы и не знали?


 
Leonid Troyanovsky ©   (2006-10-30 23:39) [23]


> Джо ©   (30.10.06 23:19) [20]

> p : array [0..255] of Char;
> Уберите выделенное.


Не уберу.
Все знают, что динамический массив Char - это String,
начинающийся с 1.

Уж  если совсем невтерпеж - пусть пользуют StrPos,
как советует АП.

А то совсем распустились, понимаешь.

--
Regards, LVT.


 
Джо ©   (2006-10-30 23:46) [24]

Всем любителям поспорить предлагаю ознакомиться с ассемблерным листингом приведенного кода (с отключенной оптимизацией):
var
 A : array of Char;
begin
Pos ("abc",string(A))
end;

---
 mov edx,[ebp-$04]
 mov eax,some_addr
 call @LStrPos

Всякий спорщик сможет убедиться, что кроме регистровой передачи двух параметров в функцию LStrPos ничего не происходит.


 
Джо ©   (2006-10-30 23:47) [25]

> [23] Leonid Troyanovsky ©   (30.10.06 23:39)
> А то совсем распустились, понимаешь.

А это уже меня не касается, мое дело было в точности на поставленный вопрос ответить :)


 
Leonid Troyanovsky ©   (2006-10-30 23:54) [26]


> Джо ©   (30.10.06 23:46) [24]

> листингом приведенного кода (с отключенной оптимизацией):


Дык, надо б было и с включенной, для полноты, так сказать.
Ну, и только для полноты ради, еще и StrPos ($O+/-)

--
Regards, LVT.


 
Джо ©   (2006-10-30 23:59) [27]

А что на него глядеть? Там что-то другое будет?


 
Leonid Troyanovsky ©   (2006-10-31 00:01) [28]


> Джо ©   (30.10.06 23:47) [25]

> А это уже меня не касается, мое дело было в точности на
> поставленный вопрос ответить :)


Зачот :)

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-10-31 00:02) [29]


> Джо ©   (30.10.06 23:59) [27]

> А что на него глядеть? Там что-то другое будет?


Тогда про оптимизацию - лишнее, IMHO.

--
Regards, LVT.


 
Джо ©   (2006-10-31 00:06) [30]

> [29] Leonid Troyanovsky ©   (31.10.06 00:02)
>
> > Джо ©   (30.10.06 23:59) [27]
>
> > А что на него глядеть? Там что-то другое будет?
>
>
> Тогда про оптимизацию - лишнее, IMHO.

Да, тут я маху дал.


 
Джо ©   (2006-10-31 01:06) [31]

> [10] Джо ©   (30.10.06 22:13)
> Это НЕ конвертирование. Это преобразование типа.

Тьфу, только сейчас заметил свою опечатку. Имелось в виду "приведение", конечно.


 
Kent25791   (2006-10-31 01:26) [32]

>> кроме регистровой передачи двух параметров в функцию LStrPos ничего не происходит.
Я говорил про большинство:
Pchar, char, WideChar, ShortString, статический массив...

А также про случай с pos, в котором string , там где требуется быстродействие, лучше не применять.


 
@!!ex ©   (2006-10-31 07:48) [33]


> А также про случай с pos, в котором string , там где требуется
> быстродействие, лучше не применять.

Почему?
Копирования там не происходит, как уже было показано...


 
Kent25791   (2006-10-31 15:02) [34]

>> Копирования там не происходит, как уже было показано...
Где было показано ??
Было показано что если сделать так string (дин. массив), тогда не происходит копирования. но см. [32].

И второе, совсем незавимимое от первого:

call @LStrPos  >> Пусть входная - string .
Войдите в Pos трассировщиком  и убедитесь.

Вот про это я говорил.


 
Kent25791   (2006-10-31 15:04) [35]

В последнем я говорю про pos(string) . См [16]



Страницы: 1 вся ветка

Текущий архив: 2006.11.19;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.046 c
15-1162051186
Chort
2006-10-28 19:59
2006.11.19
Соло на клавиатуре


2-1161855570
Tab
2006-10-26 13:39
2006.11.19
локальная база данных с возможностью шифрования


15-1161870466
kaif
2006-10-26 17:47
2006.11.19
Что за хреновая кодировка?


2-1162367551
Antonq
2006-11-01 10:52
2006.11.19
Как сообщением поменять курсор мыши


15-1162546905
Руслан
2006-11-03 12:41
2006.11.19
Нужна картинка студента