Помощь - Поиск - Пользователи - Календарь
Полная версия: Предавать-ли в процедуру параметры при помощи класса?
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Nolik
С точки зрения скорости исполнения процедуры, как правильнее организовать корректную работу процедуры с большим количеством изменяемых переменных?

1. Сформировать Class, и содержать в нем все необходимые переменные. Передавать в процедуру в качестве параметра Class. Теперь процедура работает с переменными, содержащимися в Class:
Код

MyProcedure( Class:MyClass ); begin
   Class.var1 := Class.var2 + Class.var3;
End;

2. Определить переменные в начале программы НО НЕ передавать их в MyProcedure в качестве параметров, а позволить процедуре работать с внешними (для нее) переменным:
Код

var1; var2…….varN

MyProcedure(); begin
    var1:= var2 + var3;
End;
Altair
blink.gif какой компилер ? class это зарезервированное слово!!!

Или ты под class имеешь ввиду переменную ? вообще функция - понятие математическое, поэтому передавать надо точные параметры....
Зачем тебе усложнять все и скидывать в какой то "контейнер" ?

да и по скорости любая самостоятельная переменная будет быстрее чем группа связанных...
volvo
Цитата
2. Определить переменные в начале программы НО НЕ передавать их в MyProcedure в качестве параметров, а позволить процедуре работать с внешними (для нее) переменным:
Я бы не рекомендовал так делать... Обращение к глобальным переменным из подпрограммы - очень плохая практика, с подпрограммой надо общаться через передаваемые значения.

Если у тебя настолько большое количество изменяемых переменных - не лучше ли разбить процедуру на несколько? "Не пытайтесь объять необъятное" (С) Козьма Прутков...
hardcase
Цитата(Nolik @ 26.01.2006 15:20) *
С точки зрения скорости исполнения процедуры, как правильнее организовать корректную работу процедуры с большим количеством изменяемых переменных?
Это зависит от соглашений о взове процедуры. Если параметров 3-4 и протокол __fastcall или register - то явно передавать параметры будет быстрее, чем записывать во внешние контейнеры. Если передача параметров обычная - через стек, то вызовы будут эквивалентны. Но иногда вызов без параметров будет быстрее, хотя всё равно, в процедуре, если ты будешь обращаться к внешним глобальным переменным, ты же не знаешь в каком сегменте они размещены - и какбы не пришлось по дальнему указателью к ним обращаться.

Таким образом - передавай параметры явно - это и наглядней и во многих случаях выстрее.
Nolik
Низкий поклон для volvo и hardcase,

Теперь остается вопрос каким способом (объектом/классом/контейнером) лучше заслать переменные в процедуру???

С уважением,
Илья.
hardcase
А разве просто перечислить не получается?
Nolik
Цитата(hardcase @ 26.01.2006 17:17) *

А разве просто перечислить не получается?


Получается, но требуется передавать до 15 переменных, в зависимости от процедуры. Очень не удобно получается во время отладки/развития..

1. Мне показалось удобнее сложить все переменные в контейнер и передавать во все процедуры ссылку на этот объект. А уже каждая процедура будет работать с необходимыми для неё переменными контейнера.

2. Вот и возникает вопрос каким контейнером лучше воспользоваться в этом случае, с точки зрения скорости обращения к переменным, ну и корректности Pascal в целом…

Заранее реверанс,
Илья.
volvo
Под какими компилерами будет твоя программа компилироваться? (Кроме твоего "www.wld3.com", который очень странно обрабатывает стандартные конструкции языка... wacko.gif )
Nolik
Цитата(volvo @ 26.01.2006 18:30) *

очень странно обрабатывает стандартные конструкции языка... wacko.gif )



Проверил еще раз. Оба способа передачи объекта в подпрограмму
Код
procedure Test( Cont :Container )

и
Код
procedure Test( var Cont :Container )

Работают одинаково...

Код

Type Container = class( TObject )
private protected public
  str :string;
end;

procedure Test( Cont :Container ); begin
  Cont.str:='Test';
end;

var Cont :Container;
Cont:=Container.Create;

Print(Cont.str);
Test(Cont);
Print(Cont.str);


Все-таки у меня остается не решенным вопрос:
каким контейнером лучше воспользоваться в моем случае, с точки зрения скорости обращения к переменным, ну и корректности Pascal в целом…

Илья.
volvo
Ага... Так у тебя все-таки 32-бита. Тогда ясно, Class передается по ссылке всегда. Я думал ты в 16 битном сидишь smile.gif

Я бы на твоем месте все-таки пересмотрел структуру программы... Процедура, принимающая 15 параметров... nea.gif

Ну, или просто объедини связанные между собой данные в Record (а может быть и в Object/Class, все зависит от того, что именно ты делаешь с этими данными, как именно они связаны с остальной программой, ... , и еще много причин)
hardcase
Цитата(Nolik @ 26.01.2006 21:26) *

Все-таки у меня остается не решенным вопрос:
каким контейнером лучше воспользоваться в моем случае, с точки зрения скорости обращения к переменным, ну и корректности Pascal в целом

Как сказал Вольво зашей все данные в отдельный класс, а в нём определи методы - твои процедуры и функции.
Nolik
У меня программа состоит из ОДНОГО главного цикла, в котором находится длинный список подпрограмм:
Код
FOR i:=0 to Max do begin
  Procedure1();
  Procedure2();
......
……
  ProcedureN();
END;


И даже работа с файлами производится из процедур. Таким образом, абсолютно ВСЕ переменные, определенные (и заданные) в начале кода, оказываются внешними по отношению к процедурам good.gif

Вот и получается что варианта 2:
1. Позволить процедурам работать с внешними переменными: Все прозрачно + НЕ требуется выделение дополнительной оперативной памяти. Но возникает вопрос о корректности с точки зрения языка Pascal в целом.
2. Собрать мегазборку переменных Type=Record и передавать ее в процедуры. В этом случае с точки зрения Pascal все вроде как «тип-топ», но потребуется выделение дополнительной памяти, и возможно снизится общая скорость работы программы.

Оба варианта работают одинаково, в том смысле что вычислительный результат совпадает.
Во время процесса оптимизации стратегии, программа запускается несколько сот/тысяч раз в цикле, что требует оптимизации выделения памяти и сокращения общего времени работы программы. Поскольку вся наша жизнь есть сплошной компромисс, то вопрос к Гуру от Pascal такой:
Какой вариант предпочесть???

Низкий поклон за помощь.
Илья.
Dark
помоему - удобнее всего использовть record...
если я правильно понимаю задачу
а потом передавать его адрес...

Скорость я думаю не критично снизится =) удобства зато больше.
volvo
Nolik,
Ты не хочешь читать предыдущие посты, а упорно гнешь свою линию (ведешь к тому, чтобы использовать глобальные переменные)? Так зачем спрашиваешь?

Тебе сказали, как делать - объединяй данные в Class и создавай процедуры их обработки как методов класса... Если же у тебя будет программа, написанная НЕ по принципам ООП, и ты просто прикрутишь классы для того, чтобы передавать значения в процедуры - будет коряво.

В-общем, прекращаем переливание из пустого в порожнее, если нужна конкретная помощь - присоединяй исходник, поможем оптимизировать. Если нет - тема закрыта...
hardcase
Оба варианта - разумные и удобные. Как а том анекдоте про программера - "Всё работает? - Да - Точно? - Да! - Ничего НЕ МЕНЯЙ!!"
Nolik
Цитата(hardcase @ 27.01.2006 11:43) *

Как а том анекдоте про программера - "Всё работает? - Да - Точно? - Да! - Ничего НЕ МЕНЯЙ!!"


Хороший анекдот, я его по утрам частенько вспоминаю yes2.gif


Всем активистам Гран Мерси за содействие,
Пойду перекрою весь код...


Илья.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.