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

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

Функция


Страницы:   1 2

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;


Страницы:   1 2

Наверх

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