Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 | 2 |

 

  Вопрос: массив в процедуру только как ByRef Добавлено: 29.09.09 12:01  

Автор вопроса:  fifa36
Всем привет!
Почему массив нужно передавать в процедуру только как ByRef

Ответить

  Ответы Всего ответов: 16  

Номер ответа: 1
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #1
Добавлено: 29.09.09 12:56
При передачи переменной процедуре указывается размер. У массива размер может быть разным, при этом ByRef передаёт только адрес переменной.

Ответить

Номер ответа: 2
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #2 Добавлено: 29.09.09 13:00
спасибо, понятно! а ByVal передает только значение без передачи адреса так ведь?

Ответить

Номер ответа: 3
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #3
Добавлено: 29.09.09 13:25
____ Точно. Таким образом нельзя "испортить" в процедуре значения параметров, переданных в процедуру ByVal, но хранящихся вне процедуры.
____ А по ссылке передаётся только адрес и тип параметра (тип данных). Поэтому процедура может их менять во внешней области данных.

Ответить

Номер ответа: 4
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #4
Добавлено: 29.09.09 15:31
А по ссылке передаётся только адрес и тип параметра (тип данных)
Не уверен что тип параметра. Я конечно в этом не спец, но, например, если смотреть в длл какие функции фзает - там указывается размер переменных(что-то типа @16).ADSemenov.ru

Ответить

Номер ответа: 5
Автор ответа:
 GDK



Вопросов: 13
Ответов: 348
 Профиль | | #5 Добавлено: 29.09.09 17:05
ByVal

Причём через стэк кажется. Поэтому дольше.

Ответить

Номер ответа: 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-сайт: www.rascalspb.narod.ru
 Профиль | | #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
посмотреть в сторону ООП
давно пора. Но не всегда следует использовать только ООП. Не надо перегибов. А события можно посмотреть в IDE когда пишешь модуль класса. Ну и описать реакцию на эти события там же. Все объекты данного класса будут реагировать на эти события.
Передавать много параметров - замедлится быстродействие. Ну и неудобно вызывать эти процедуры извне.
С классами удобнее. Можно юзать раннее связывание.

Ответить

Номер ответа: 14
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #14
Добавлено: 05.10.09 23:41
суть классов как раз в позднес связывании, ну это ладно, ибо в вб его реализовать только через интерфейсы вроде.
а по поводу передачи параметров - это вопрос проектирования. Быстродействие смотрится после разработки, нет смысла в преждевременной оптимизации. Ну и передача многих параметров скорее проблема поддержки, нежели скорости. Ибо передача цепочки подразумевает видимость данных на многих уровнях. Если промежуточные вызовы ничего не делают с параметрами - значит чтото сделано не так. Советую глянуть книжку К. Лармана "Применение UML 2.0 и шаблонов проектирования". Там рассказывается как раз про эти проблемы.

Ответить

Номер ответа: 15
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #15
Добавлено: 07.10.09 19:32
Чёт как-то от темы ушли.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам