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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2021, 21:45   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 624
По умолчанию TStrings в параметрах

Вопрос такой:
Если в параметрах процедуры есть переменная TStrings, и перед ней не прописано ни var ни const, то она в таком случае копируется, или работает по ссылке как в случае с var ?
Kronos913 вне форума Ответить с цитированием
Старый 20.05.2021, 22:06   #2
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 624
По умолчанию

Вот такой код.
В этом случае идет напрямую обращение, как в случае с var?

Код:
Procedure SortAddStringToTStrings(const s:string; ss: TStrings; const st:byte);
var
 j:longInt;
 a:boolean;
begin
 j:=st;
 a:=true;
 while (j<ss.Count) do begin
  If s<ss[j] then begin
   ss.Insert(j, s);
   a:=false;
   j:=ss.Count;
  end else inc(j);
 end;
 If a then ss.Add(s);
end;
Kronos913 вне форума Ответить с цитированием
Старый 21.05.2021, 04:36   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Если верно понял ассемблер, то по ссылке (по адресу на объект). А по поводу остального кода: зачем игнорировать существование break (будет безусловный выход из цикла, а не лишняя проверка условия цикла); при известном количестве итераций лучше использовать цикл for (заодно свойство count не будет "дергаться" на каждой итерации цикла).
Код:
Procedure SortAddStringToTStrings(const s: string; ss: TStrings; const st: byte);
var
  j: LongInt;
begin
  for j := st to ss.Count - 1 do
    If s < ss[j] then
    begin
      ss.Insert(j, s);
      exit;
    end;
  ss.Add(s);
end;
А если есть гарантия отсортированности ss и там лежит достаточно много элементов, то двоичный поиск места вставки может быть лучше.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 21.05.2021, 11:04   #4
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 624
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Если верно понял ассемблер, то по ссылке (по адресу на объект). А по поводу остального кода: зачем игнорировать существование break (будет безусловный выход из цикла, а не лишняя проверка условия цикла); при известном количестве итераций лучше использовать цикл for (заодно свойство count не будет "дергаться" на каждой итерации цикла).
Код:
Procedure SortAddStringToTStrings(const s: string; ss: TStrings; const st: byte);
var
  j: LongInt;
begin
  for j := st to ss.Count - 1 do
    If s < ss[j] then
    begin
      ss.Insert(j, s);
      exit;
    end;
  ss.Add(s);
end;
А если есть гарантия отсортированности ss и там лежит достаточно много элементов, то двоичный поиск места вставки может быть лучше.
По поводу цикла For - там может быть такая проблема:
Если ввести в параметр st единицу (чтобы фильтр не трогал нулевую строку), в TString'се на данный момент только нулевая строка, получится так:
st = 1, (ss.Count - 1) = 0
И в этом случае for должен выдать ошибку

По поводу остальных правок - большое спасибо
Kronos913 вне форума Ответить с цитированием
Старый 21.05.2021, 11:21   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
И в этом случае for должен выдать ошибку
Да не ошибку - просто цикл не выполнится ни разу. На этапе компиляции компилятор не знает, что там в st и ss.Count . Если бы задавались константы
Код:
for j := 2 to 1 do
тогда компилятор (а не исполняемый код), похоже, выдал бы ошибку.

Последний раз редактировалось digitalis; 21.05.2021 в 11:26.
digitalis вне форума Ответить с цитированием
Старый 21.05.2021, 15:43   #6
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 624
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Да не ошибку - просто цикл не выполнится ни разу. На этапе компиляции компилятор не знает, что там в st и ss.Count . Если бы задавались константы
Код:
for j := 2 to 1 do
тогда компилятор (а не исполняемый код), похоже, выдал бы ошибку.
Я имел в виду: в процессе работы программа в процессе не выдаст ошибку, если в цикле for нижняя граница больше верхней?
Kronos913 вне форума Ответить с цитированием
Старый 21.05.2021, 17:09   #7
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Нет, просто цикл не выполнится ни разу.
Когда параметр цикла меняется в процессе работы программы, да ещё чтоб вылетала по ошибке в такой ситуации - программисты бы все дружно утопились.

Последний раз редактировалось digitalis; 21.05.2021 в 17:11.
digitalis вне форума Ответить с цитированием
Старый 21.05.2021, 20:43   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Код:
for j := 2 to 1 do
тогда компилятор (а не исполняемый код), похоже, выдал бы ошибку.
D7 в таком случае просто сообщил: "[Hint] Unit1.pas(30): FOR or WHILE loop executes zero times - deleted".
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 21.05.2021, 22:43   #9
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Я бы не смог так хорошо выразиться, как D7
digitalis вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Об использовании this в параметрах методов hoz Общие вопросы .NET 10 13.12.2015 18:50
Ссылка в параметрах функции Uefa Помощь студентам 2 30.10.2014 19:29
Объекты в параметрах функций romantik2011 PHP 3 28.07.2011 21:07
О параметрах запуска и CreateProcess Человек_Борща Общие вопросы Delphi 2 01.06.2011 10:01
ошибк в функции в параметрах.... Chica Bond Общие вопросы C/C++ 5 02.05.2010 22:23