IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Предавать-ли в процедуру параметры при помощи класса?, Предавать-ли в процедуру параметры при помощи класса???
Nolik
сообщение 26.01.2006 15:20
Сообщение #1





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


С точки зрения скорости исполнения процедуры, как правильнее организовать корректную работу процедуры с большим количеством изменяемых переменных?

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;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 26.01.2006 15:28
Сообщение #2


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


blink.gif какой компилер ? class это зарезервированное слово!!!

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

да и по скорости любая самостоятельная переменная будет быстрее чем группа связанных...


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.01.2006 15:47
Сообщение #3


Гость






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

Если у тебя настолько большое количество изменяемых переменных - не лучше ли разбить процедуру на несколько? "Не пытайтесь объять необъятное" (С) Козьма Прутков...
 К началу страницы 
+ Ответить 
hardcase
сообщение 26.01.2006 16:05
Сообщение #4


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


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

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


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Nolik
сообщение 26.01.2006 17:15
Сообщение #5





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Низкий поклон для volvo и hardcase,

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

С уважением,
Илья.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hardcase
сообщение 26.01.2006 17:17
Сообщение #6


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


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


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Nolik
сообщение 26.01.2006 18:27
Сообщение #7





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Цитата(hardcase @ 26.01.2006 17:17) *

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


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

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

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

Заранее реверанс,
Илья.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.01.2006 18:30
Сообщение #8


Гость






Под какими компилерами будет твоя программа компилироваться? (Кроме твоего "www.wld3.com", который очень странно обрабатывает стандартные конструкции языка... wacko.gif )
 К началу страницы 
+ Ответить 
Nolik
сообщение 26.01.2006 21:26
Сообщение #9





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Цитата(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 в целом…

Илья.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.01.2006 21:33
Сообщение #10


Гость






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

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

Ну, или просто объедини связанные между собой данные в Record (а может быть и в Object/Class, все зависит от того, что именно ты делаешь с этими данными, как именно они связаны с остальной программой, ... , и еще много причин)
 К началу страницы 
+ Ответить 
hardcase
сообщение 26.01.2006 21:41
Сообщение #11


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


Цитата(Nolik @ 26.01.2006 21:26) *

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

Как сказал Вольво зашей все данные в отдельный класс, а в нём определи методы - твои процедуры и функции.


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Nolik
сообщение 27.01.2006 4:51
Сообщение #12





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


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


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

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

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

Низкий поклон за помощь.
Илья.

Сообщение отредактировано: Nolik - 27.01.2006 6:53
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Dark
сообщение 27.01.2006 5:18
Сообщение #13


Знаток
****

Группа: Пользователи
Сообщений: 408
Пол: Мужской

Репутация: -  3  +


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

Скорость я думаю не критично снизится =) удобства зато больше.


--------------------
- Где я?
- Во тьме.
- В какой тьме?
- Во тьме твоего мозга.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.01.2006 11:39
Сообщение #14


Гость






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

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

В-общем, прекращаем переливание из пустого в порожнее, если нужна конкретная помощь - присоединяй исходник, поможем оптимизировать. Если нет - тема закрыта...
 К началу страницы 
+ Ответить 
hardcase
сообщение 27.01.2006 11:43
Сообщение #15


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


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


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Nolik
сообщение 27.01.2006 14:22
Сообщение #16





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Цитата(hardcase @ 27.01.2006 11:43) *

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


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


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


Илья.

Сообщение отредактировано: Nolik - 27.01.2006 16:15
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.07.2025 14:56
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"