Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2014, 16:10   #11
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Цитата:
Сообщение от StriderX Посмотреть сообщение
Считается "bad practice" в смысле дёрганья менеджера памяти - надо, чтобы у него было как можно меньше телодвижений. Сейчас пошла мода на immutable строки, считайте, что никакой делит выполнить в принципе нельзя ибо запрещены изменения источника - только создать копию (а собирательствами должен заниматься какой-нибудь TStringBuilder). Поэтому все алгоритмы переписываются в расчете на работу с immutable.
Извольте...
Код:
function TrimChar(const _Ch: Char; str: string): string;
var
tmp: string;
begin
      tmp:= str;
      while  Length(tmp) > 0 do
        if tmp[1] = _Ch then delete(tmp, 1, 1) else
          begin
          Result:= tmp;
          exit;
          end;
end;
Iron Monk вне форума Ответить с цитированием
Старый 03.12.2014, 21:14   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Iron Monk, имхо, это код не сильно лучше.
Каждый вызов delete(tmp, 1, 1) приводит к тому, что в памяти выделяется память под новую строку, в созданную строку переписывается текст без удаляемого символа, потом старый tmp удаляется, и в переменную tmp (которая является УКАЗАТЕЛЕМ на строку) переписывается указатель на новую область памяти.
Это и есть та самая "bad practice".

Если Вам интересно, как написать "good" - то очень рекомендую разобрать алгоритм, предложенный StriderX в пост #2.
Обратите внимание, что при переборе строки она НЕ ИЗМЕНЯЕТСЯ (изменяется только счётчик, отсчитывающий, сколько пустых символ в начале строки подлежит удалению).
А потом мы сразу возвращаем ПОДСТРОКУ нужной длины (без пустых символов).
It's GOOD!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.12.2014, 21:53   #13
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Ок, без делита.
Код:
function TrimChar(const _Ch: Char; str: string): string;
var
tmp: string;
i  : integer;
begin
  tmp:= str;
  for i:= 1 to Length(tmp) do
    if  _Ch <> tmp[i] then
      begin
      Result:= Copy(tmp, i, Length(tmp));
      exit;
      end;
end;
Iron Monk вне форума Ответить с цитированием
Старый 03.12.2014, 22:01   #14
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Iron Monk Посмотреть сообщение
Ок, без делита.
Код:
function TrimChar(const _Ch: Char; str: string): string;
var
tmp: string;
i  : integer;
begin
  tmp:= str;
  for i:= 1 to Length(tmp) do
    if  _Ch <> tmp[i] then
      begin
      Result:= Copy(tmp, i, Length(tmp));
      exit;
      end;
end;
Copy та же хня.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.12.2014, 22:05   #15
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Copy та же хня.
Но копируется только один раз. Идем дальше:
Код:
function TrimChar(const _Ch: Char; str: string): string;
var
tmp: string;
i  : integer;
begin
  tmp:= str;
  for i:= 1 to Length(tmp) do
    if  _Ch <> tmp[i] then
      Result:= Result + tmp[i];
end;
Или даже так:
Код:
function TrimChar(const _Ch: Char; const str: string): string;
var
i  : integer;
begin
  for i:= 1 to Length(str) do
    if _Ch <> str[i] then
      Result:= Result + str[i];
end;

Последний раз редактировалось Iron Monk; 03.12.2014 в 22:28.
Iron Monk вне форума Ответить с цитированием
Старый 03.12.2014, 23:13   #16
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

мне вариант с Copy (пост #13) понравился.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.12.2014, 23:22   #17
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
мне вариант с Copy (пост #13) понравился.
Ну с Copy, говорят, не тру...
Iron Monk вне форума Ответить с цитированием
Старый 03.12.2014, 23:43   #18
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Ну с Copy, говорят, не тру...
повторю, на мой взгляд - нормально!
Выделение памяти под Result и копирование туда подстроки (Copy) произойдёт один раз за вызов функции. Это нормально!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.12.2014, 23:53   #19
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
повторю, на мой взгляд - нормально!
Выделение памяти под Result и копирование туда подстроки (Copy) произойдёт один раз за вызов функции. Это нормально!
Ну, тогда и переменную tmp можно убрать - ведь переданную в функцию строку мы только читаем.
Iron Monk вне форума Ответить с цитированием
Старый 04.12.2014, 00:33   #20
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
у, тогда и переменную tmp можно убрать - ведь переданную в функцию строку мы только читаем.
Конечно можно и нужно!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отбросить пробелы после числа? MishkaSh Помощь студентам 1 04.04.2013 05:52
заменить элементы одномерного массива, стоящие перед минимальным - на нули, а стоящие после максимального - на единицы (Паскаль) Женька Good Помощь студентам 2 01.12.2011 06:22
как заставить VBA не откидывать нули впереди числа kusyusha Microsoft Office Word 3 14.11.2010 22:27
Дано число. Отбросить в нем все цифры, стоящие левее самой правой единицы. SkApY Помощь студентам 5 09.11.2009 20:58
как отбросить целую часть оставив дробную Alex26RusLink Паскаль, Turbo Pascal, PascalABC.NET 1 24.10.2009 11:36