Форум: "Начинающим";
Текущий архив: 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