Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.085 c
15-1162384104
UMU
2006-11-01 15:28
2006.11.19
Delphi 7 и Turbo Delphi Explorer


1-1159802399
kyn66
2006-10-02 19:19
2006.11.19
Отловить в процессах ДОС-приложение


2-1162280494
Делфи
2006-10-31 10:41
2006.11.19
IP


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


11-1138876248
Dodfr
2006-02-02 13:30
2006.11.19
Problem ListBox.OnDrawItem





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский