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