![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Функция
Fu © (2006-08-10 19:50:00)Какая в делфи есть функция , чтобы строке s1 присвоить текст меежду запятыми от строки s.
код:
s:='blablabla;1234566;blablablabla';
а s1 должно принимать значение 1234566 соответственно
Bless (2006-08-14 09:19:00) [1]
> evvcom © (14.08.06 09:11) [30]
>
> > [29] Bless © (14.08.06 09:00)
> > Дык, он же Delete(sInput,... делает!
>
> Дык, он же не нужен! Это я раскритиковал чуть выше замечания
> про отсутствие const:
>
Ясно. Я ж не знал, что это было замечание к его примеру, как если бы он уже учел предыдущие замечания :)
evvcom (2006-08-14 09:11:00) [2]> [29] Bless © (14.08.06 09:00)
> Дык, он же Delete(sInput,... делает!
Дык, он же не нужен! Это я раскритиковал чуть выше замечания про отсутствие const:
> [15] evvcom © (11.08.06 09:43)
> > Delete(sInput, 1,Pos(sPart, sInput));
>
> Зачем еще и махинации с входными данными совершать? Есть
> же PosEx. Его и пользуй.
Bless (2006-08-14 09:00:00) [3]
> evvcom © (11.08.06 17:37) [27]
>
> > Как ему надо было написать?
>
> function explode( constsPart, sInput: string): ...;
Дык, он жеDelete(sInput,...делает!
SerJaNT (2006-08-12 02:22:00) [4]
> de(const sPart,
действительно!
evvcom (2006-08-11 17:37:00) [5]> [26] Bless © (11.08.06 17:26)
Еще не ушел домой... :(
> Как ему надо было написать?
function explode( constsPart, sInput: string): ...;
Bless (2006-08-11 17:26:00) [6]
> evvcom © (11.08.06 17:04) [23]
>
> > [21] Bless © (11.08.06 16:48)
>
> Да. Недавно обсуждалось это. Выяснили, что строки копируются
> по новым адресам при необходимости. В данном коде такая
> необходимость прослеживается. Потому sInput будет скопирована.
>
>
Я все же не понял суть претензии к строчке
> function explode(sPart, sInput: string):
Как ему надо было написать?
SerJaNT (2006-08-11 17:16:00) [7]
> Пиши, как знаешь.
Да это не мне надо! Я просто написал как знаю. Все, я тоже домой пошел.
evvcom (2006-08-11 17:15:00) [8]> Кстати, а винт тут не причем - мы же ничего не пишем/читаем!
Мы читаем с винта exe-файл. C той неоптимальностью, с которой написана функция, она увеличивает размер, ну скажем, процентов на 10-20. Это всего навсего маленькая функция, но написана очень небрежно. Я встречал и более небрежное отношение к коду, как многие сейчас любят говорить, "тупое" копирование тела функции и легкий макияж. В итоге код, написанный таким программистом, увеличивается процентов на 100, а то и более! Вот при том тут и винт.
Все, устал чего-то доказывать. Пиши, как знаешь. Ушел домой.
evvcom (2006-08-11 17:04:00) [9]> [21] Bless © (11.08.06 16:48)
Да. Недавно обсуждалось это. Выяснили, что строки копируются по новым адресам при необходимости. В данном коде такая необходимость прослеживается. Потому sInput будет скопирована.
SerJaNT (2006-08-11 16:55:00) [10]
> Т.е. на оптимизацию можно забить. Ну винт хоть пожалей.
Кстати, а винт тут не причем - мы же ничего не пишем/читаем! Нет, я же конечно за оптимизацию, но я просто сказал что 1 pos что 5. Даже старым компам пофиг будет.
Bless (2006-08-11 16:48:00) [11]
> evvcom © (11.08.06 09:43) [15]
> > function explode(sPart, sInput: string):
>
> Во-во. Еще и копию обязательно нужно сделать.
>
>
Копию чего?
MsGuns (2006-08-11 15:53:00) [12]Страшная ветка
evvcom (2006-08-11 15:38:00) [13]> Ты даже не заметишь 1 pos будет или 5.
Т.е. на оптимизацию можно забить. Ну винт хоть пожалей.
SerJaNT (2006-08-11 14:59:00) [14]
> Нафига 3 раза Pos(sPart, sInput) вызывать? Или проц мощный,
> пущай работает? Используй локальные переменные.
Я думаю это не критично для проца. Ты даже не заметишь 1 pos будет или 5.
> а чем тебе моя не понравилась - так-же работает :-)
А я и не говорю что мне твой вариант не понравился. Мой - тоже способ.
KilkennyCat (2006-08-11 09:53:00) [15]Pos and LastDelimiter
tesseract (2006-08-11 09:45:00) [16]
> SerJaNT © (11.08.06 09:19) [14]
а чем тебе моя не понравилась - так-же работает :-)
evvcom (2006-08-11 09:43:00) [17]> [14] SerJaNT © (11.08.06 09:19)
Нафига 3 раза Pos(sPart, sInput) вызывать? Или проц мощный, пущай работает? Используй локальные переменные.
> Delete(sInput, 1,Pos(sPart, sInput));
Зачем еще и махинации с входными данными совершать? Есть же PosEx. Его и пользуй.
> function explode(sPart, sInput: string):
Во-во. Еще и копию обязательно нужно сделать.
> S:=explode(';',s);
> s2:=S[1]; // то что тебе нужно
А AV словить?
SerJaNT (2006-08-11 09:19:00) [18]
function explode(sPart, sInput: string): ArrOfStr;
begin
while Pos(sPart, sInput) <> 0 do
begin
SetLength(Result, Length(Result) + 1);
Result[Length(Result) - 1] := Copy(sInput, 0,Pos(sPart, sInput) - 1);
Delete(sInput, 1,Pos(sPart, sInput));
end;
SetLength(Result, Length(Result) + 1);
Result[Length(Result) - 1] := sInput;
end;
Работает!
Пример использования:
type
ArrOfStr = array of string;
var
S:ArrOfStr;
s2:string;
...
S:=explode(';',s);
s2:=S[1]; // то что тебе нужно
evvcom (2006-08-11 09:12:00) [19]> [10] !_SM_! (11.08.06 02:49)
> Но так мне кажеться будет медленнее. Выполнять функцию Length
> много раз... Т.е. в цикле будет каждый раз высчитываться
> Length(Stroka) и сравниваться с N. Или не так, ошибаюсь....?
Не так. Ошибаешься... А вот
> Result := Stroka[N] + Result;
может привести к неоднократному перевыделению памяти под новый стринг и обязательно на каждом проходе с чтениями и записями нового Length(Result). Итог: так не пишут.
Loginov Dmitry (2006-08-11 08:01:00) [20]Если уж гнаться за скоростью, тогда вот это:
function Functiya(Text: string; Delim: Char): string;
var
I, C: Integer;
Buf1, Buf2: PChar;
begin
C := -1;
Result := Text;
Buf1 := PChar(Text);
Buf2 := PChar(Result);
for I := Pos(Delim, Text) to Length(Text) - 1 do
if Buf1[I] = Delim then
Break
else begin
Inc(C);
Buf2[C] := Buf1[I];
end;
SetLength(Result, C + 1);
end;