Вопрос: массив в процедуру только как ByRef | Добавлено: 29.09.09 12:01 |
Автор вопроса: ![]() |
Всем привет!
Почему массив нужно передавать в процедуру только как ByRef |
Ответы | Всего ответов: 16 |
Номер ответа: 1 Автор ответа: ![]() ![]() ICQ: 345685652 Вопросов: 96 Ответов: 1212 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 29.09.09 12:56 |
При передачи переменной процедуре указывается размер. У массива размер может быть разным, при этом ByRef передаёт только адрес переменной. |
Номер ответа: 2 Автор ответа: ![]() ![]() Вопросов: 33 Ответов: 116 |
Профиль | Цитата | #2 | Добавлено: 29.09.09 13:00 |
спасибо, понятно! а ByVal передает только значение без передачи адреса так ведь? |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 5 Ответов: 276 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 29.09.09 13:25 |
____ Точно. Таким образом нельзя "испортить" в процедуре значения параметров, переданных в процедуру ByVal, но хранящихся вне процедуры.
____ А по ссылке передаётся только адрес и тип параметра (тип данных). Поэтому процедура может их менять во внешней области данных. |
Номер ответа: 4 Автор ответа: ![]() ![]() ICQ: 345685652 Вопросов: 96 Ответов: 1212 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 29.09.09 15:31 |
А по ссылке передаётся только адрес и тип параметра (тип данных) Не уверен что тип параметра. Я конечно в этом не спец, но, например, если смотреть в длл какие функции фзает - там указывается размер переменных(что-то типа @16).ADSemenov.ru
|
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 13 Ответов: 348 |
Профиль | Цитата | #5 | Добавлено: 29.09.09 17:05 |
ByVal
Причём через стэк кажется. Поэтому дольше. |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #6 | Добавлено: 30.09.09 06:25 |
Если опасаешься что процедура повредит твой массив данных (хотя о чем ты, ты пишешь на VB6 и явно не компонент который будут использовать другие разрабочтики), то перед передачей клонируй массив и передавай в процедуру копию.
В .NET кстати массивы тоже передаются только по ссылке и защитить их от повреждения невозможно (впрочем есть оболочки которые позволяют это сделать, тот же ReadOnlyCollection) |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 13 Ответов: 348 |
Профиль | Цитата | #7 | Добавлено: 02.10.09 13:06 |
то перед передачей клонируй массив и передавай в процедуру копию.
Я наоборот в получающей процедуре параметры стараюсь копировать. Хрен редьки не слаще. |
Номер ответа: 8 Автор ответа: ![]() ![]() Вопросов: 33 Ответов: 116 |
Профиль | Цитата | #8 | Добавлено: 02.10.09 15:53 |
А подскажите плиз! У меня страсть делать программу из полность независимых процедур и поэтому приходится передавать большое количество аргументов. Рационально ли это, лучше ли чем объявлять глобальные имена? |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #9 | Добавлено: 02.10.09 16:03 |
Однозначный ответ на вопрос сложно дать.
В процедуру нужно передавать только те параметры, которые в ней нужны. Откуда у тебя "большое количество аргументво"? С чем связано то что их много? Если это данные то может их лучше перенести в структуры данных? |
Номер ответа: 10 Автор ответа: ![]() ![]() Вопросов: 33 Ответов: 116 |
Профиль | Цитата | #10 | Добавлено: 02.10.09 16:11 |
ну например в модуль в котором находятся вспомогательные процедуры для формы, приходится много чего передавать, например в функцию которая достает данные из базы надо передать объект соединения, SQL запрос, а она в свою очередь передает аргументы в другую вспомогательную которая открыват рекордсет и т д. Вот поэтому интересно как это сильно ли загружает память или может наоборот освобождает т.к. нет глобальных переменных |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 8068014 Вопросов: 18 Ответов: 817 |
Web-сайт: Профиль | Цитата | #11 | Добавлено: 03.10.09 02:02 |
главное, чтобы порграмму можно было легко поддерживать и модифицировать. разделение на модули и классы - самое верное решение. вообще советую посомтреть в сторону ООП. ибо модули не дают такой гибкости. классы позволят хранить данные вполне безнаказанно, в отличии от глобальных переменных. |
Номер ответа: 12 Автор ответа: ![]() ![]() Вопросов: 33 Ответов: 116 |
Профиль | Цитата | #12 | Добавлено: 05.10.09 09:15 |
То есть вы имеете например создать класс соединениний, класс рекордсетов с соответствующими процедурами и т.д., правильно? классная идея спасибо!
А вот еще вопрос кстати, как обрабатывать события класса, не подскажете? То есть в классе например добавил 4 объекта, события одинаковые у объектов класса , нужно прописывать для каждого объекта отдельно процедуру обработки событий или можно одну для всех для кждого типа события |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 13 Ответов: 348 |
Профиль | Цитата | #13 | Добавлено: 05.10.09 17:00 |
посмотреть в сторону ООП давно пора. Но не всегда следует использовать только ООП. Не надо перегибов. А события можно посмотреть в IDE когда пишешь модуль класса. Ну и описать реакцию на эти события там же. Все объекты данного класса будут реагировать на эти события.
Передавать много параметров - замедлится быстродействие. Ну и неудобно вызывать эти процедуры извне. С классами удобнее. Можно юзать раннее связывание. |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 8068014 Вопросов: 18 Ответов: 817 |
Web-сайт: Профиль | Цитата | #14 | Добавлено: 05.10.09 23:41 |
суть классов как раз в позднес связывании, ну это ладно, ибо в вб его реализовать только через интерфейсы вроде.
а по поводу передачи параметров - это вопрос проектирования. Быстродействие смотрится после разработки, нет смысла в преждевременной оптимизации. Ну и передача многих параметров скорее проблема поддержки, нежели скорости. Ибо передача цепочки подразумевает видимость данных на многих уровнях. Если промежуточные вызовы ничего не делают с параметрами - значит чтото сделано не так. Советую глянуть книжку К. Лармана "Применение UML 2.0 и шаблонов проектирования". Там рассказывается как раз про эти проблемы. |
Номер ответа: 15 Автор ответа: ![]() ![]() ICQ: 345685652 Вопросов: 96 Ответов: 1212 |
Web-сайт: Профиль | Цитата | #15 | Добавлено: 07.10.09 19:32 |
Чёт как-то от темы ушли. |
|