Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Pos и дин. массив


Страницы:   1 2

Kent25791 ©   (2006-10-30 20:50:00) 

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


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

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


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

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

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

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

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


@!!ex   (2006-10-31 07:48:00) [3]


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

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


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

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

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


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

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

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


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

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

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


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


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

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


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

--
Regards, LVT.


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


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

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


Зачот :)

--
Regards, LVT.


Джо   (2006-10-30 23:59:00) [9]

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


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


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

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


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

--
Regards, LVT.


Джо   (2006-10-30 23:47:00) [11]

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

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


Джо   (2006-10-30 23:46:00) [12]

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

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

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


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


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

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


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

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

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

--
Regards, LVT.


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

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


PVOzerski   (2006-10-30 23:24:00) [15]

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

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

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


Джо   (2006-10-30 23:19:00) [16]

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


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


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


> Джо ©   (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.


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


> Kent25791   (30.10.06 22:42) [16]

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


Anatoly Podgoretsky   (2006-10-30 22:43:00) [19]

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


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

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

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо