1. Заголовок или название темы должно быть информативным ! 2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК ! 4.НЕ используйте форум для личного общения! 5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Предавать-ли в процедуру параметры при помощи класса?, Предавать-ли в процедуру параметры при помощи класса???
С точки зрения скорости исполнения процедуры, как правильнее организовать корректную работу процедуры с большим количеством изменяемых переменных?
1. Сформировать Class, и содержать в нем все необходимые переменные. Передавать в процедуру в качестве параметра Class. Теперь процедура работает с переменными, содержащимися в Class:
Код
MyProcedure( Class:MyClass ); begin Class.var1 := Class.var2 + Class.var3; End;
2. Определить переменные в начале программы НО НЕ передавать их в MyProcedure в качестве параметров, а позволить процедуре работать с внешними (для нее) переменным:
какой компилер ? class это зарезервированное слово!!!
Или ты под class имеешь ввиду переменную ? вообще функция - понятие математическое, поэтому передавать надо точные параметры.... Зачем тебе усложнять все и скидывать в какой то "контейнер" ?
да и по скорости любая самостоятельная переменная будет быстрее чем группа связанных...
--------------------
Помогая друг другу, мы справимся с любыми трудностями! "Не опускать крылья!" (С)
2. Определить переменные в начале программы НО НЕ передавать их в MyProcedure в качестве параметров, а позволить процедуре работать с внешними (для нее) переменным:
Я бы не рекомендовал так делать... Обращение к глобальным переменным из подпрограммы - очень плохая практика, с подпрограммой надо общаться через передаваемые значения.
Если у тебя настолько большое количество изменяемых переменных - не лучше ли разбить процедуру на несколько? "Не пытайтесь объять необъятное" (С) Козьма Прутков...
С точки зрения скорости исполнения процедуры, как правильнее организовать корректную работу процедуры с большим количеством изменяемых переменных?
Это зависит от соглашений о взове процедуры. Если параметров 3-4 и протокол __fastcall или register - то явно передавать параметры будет быстрее, чем записывать во внешние контейнеры. Если передача параметров обычная - через стек, то вызовы будут эквивалентны. Но иногда вызов без параметров будет быстрее, хотя всё равно, в процедуре, если ты будешь обращаться к внешним глобальным переменным, ты же не знаешь в каком сегменте они размещены - и какбы не пришлось по дальнему указателью к ним обращаться.
Таким образом - передавай параметры явно - это и наглядней и во многих случаях выстрее.
Получается, но требуется передавать до 15 переменных, в зависимости от процедуры. Очень не удобно получается во время отладки/развития..
1. Мне показалось удобнее сложить все переменные в контейнер и передавать во все процедуры ссылку на этот объект. А уже каждая процедура будет работать с необходимыми для неё переменными контейнера.
2. Вот и возникает вопрос каким контейнером лучше воспользоваться в этом случае, с точки зрения скорости обращения к переменным, ну и корректности Pascal в целом…
Под какими компилерами будет твоя программа компилироваться? (Кроме твоего "www.wld3.com", который очень странно обрабатывает стандартные конструкции языка... )
очень странно обрабатывает стандартные конструкции языка... )
Проверил еще раз. Оба способа передачи объекта в подпрограмму
Код
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 в целом…
Ага... Так у тебя все-таки 32-бита. Тогда ясно, Class передается по ссылке всегда. Я думал ты в 16 битном сидишь
Я бы на твоем месте все-таки пересмотрел структуру программы... Процедура, принимающая 15 параметров...
Ну, или просто объедини связанные между собой данные в Record (а может быть и в Object/Class, все зависит от того, что именно ты делаешь с этими данными, как именно они связаны с остальной программой, ... , и еще много причин)
Все-таки у меня остается не решенным вопрос: каким контейнером лучше воспользоваться в моем случае, с точки зрения скорости обращения к переменным, ну и корректности Pascal в целом
Как сказал Вольво зашей все данные в отдельный класс, а в нём определи методы - твои процедуры и функции.
У меня программа состоит из ОДНОГО главного цикла, в котором находится длинный список подпрограмм:
Код
FOR i:=0 to Max do begin Procedure1(); Procedure2(); ...... …… ProcedureN(); END;
И даже работа с файлами производится из процедур. Таким образом, абсолютно ВСЕ переменные, определенные (и заданные) в начале кода, оказываются внешними по отношению к процедурам
Вот и получается что варианта 2: 1. Позволить процедурам работать с внешними переменными: Все прозрачно + НЕ требуется выделение дополнительной оперативной памяти. Но возникает вопрос о корректности с точки зрения языка Pascal в целом. 2. Собрать мегазборку переменных Type=Record и передавать ее в процедуры. В этом случае с точки зрения Pascal все вроде как «тип-топ», но потребуется выделение дополнительной памяти, и возможно снизится общая скорость работы программы.
Оба варианта работают одинаково, в том смысле что вычислительный результат совпадает. Во время процесса оптимизации стратегии, программа запускается несколько сот/тысяч раз в цикле, что требует оптимизации выделения памяти и сокращения общего времени работы программы. Поскольку вся наша жизнь есть сплошной компромисс, то вопрос к Гуру от Pascal такой: Какой вариант предпочесть???
Nolik, Ты не хочешь читать предыдущие посты, а упорно гнешь свою линию (ведешь к тому, чтобы использовать глобальные переменные)? Так зачем спрашиваешь?
Тебе сказали, как делать - объединяй данные в Class и создавай процедуры их обработки как методов класса... Если же у тебя будет программа, написанная НЕ по принципам ООП, и ты просто прикрутишь классы для того, чтобы передавать значения в процедуры - будет коряво.
В-общем, прекращаем переливание из пустого в порожнее, если нужна конкретная помощь - присоединяй исходник, поможем оптимизировать. Если нет - тема закрыта...