Что нового

Пояснения по ByRef

BlackRock

Новичок
Сообщения
16
Репутация
0
Здравствуйте, мне не совсем понятен смысл выражения в некоторых функциях:
функция(ByRef $oIE, ....). Какие объекты нужно выделять и в каких случаях. Очень прошу ответить не копипастом из талмута, а живым языком, чтобы понять смысл.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
BlackRock
а куда еще живее. в русской справке все понятно написано. лично я использую это ключевое слово для работы с массивами, когда нужно увеличить или уменьшить массив, изменить в нем данные.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Byref объектов, имхо, не имеет смысл, т.к они всегда передаются по ссылке. Т.е в языке нету возможности сохранить, склонировать объект.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Передача параметра по имени (по ссылке).
Это одно из базовых понятий в программировании.
BlackRock, где Вы изучали программирование?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
BlackRock [?]
мне не совсем понятен смысл выражения в некоторых функциях
Преимущество передачи аргумента ByRef заключается в том, что процедура может возвратить значение в вызывающий код через этот аргумент.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
BlackRock
Если без ByRef, то внутри функции создаётся копия переменной, если с ByRef, то копия не создаётся, а внешняя и внутренняя переменная это один и тот же объект, просто с разными именами.
Читай Область видимости, 4-ый абзац. Или в справке Func
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Если не указано ByRef, то при вызове функции из стека выделяется блок памяти нужного размера, в который копируются данные, соответствующие передаваемой переменной. Внутри же функции адресация происходит на этот блок памяти. Технически, все передаваемые в функцию данные без ByRef ничем не отличаются от локальных данных с предварительной инициализацией, объявленных внутри самой функции. Перед завершением функции вся выделенная память автоматически освобождается, благодаря чему нет необходимости заниматься этим самостоятельно. Например, можно не уничтожать структуры, которые были созданы внутри функции.

Если указано ByRef, то при вызове функции никакой дополнительной памяти для этих данных выделено не будет, а адресация будет происходить непосредственно на "оригинальные" данные. Вследствии чего любые изменения, сделанные внутри функции, отразятся на самих данных. Во избежании случайного изменения данных можно перед ByRef указать Const (Const ByRef). В этом случае AutoIt выдаст ошибку при первой же попытке изменить данные. Если используется ByRef, то соответствующая переменная должна быть объявлена до вызова функции.

ByRef используется в следующих ситуациях:

1. Функция возвращает более одного параметра.
2. Передача и возврат данных посредством одной переменной.
3. Передача в функцию объемных данных (массивов), чтобы избежать потери времени на их копирование при вызове функции. Особенно актуально, когда функция вызывается многократно, например в цикле. В этом случае целесообразно использовать Const ByRef.

Некоторые типы данных, такие как объекты или структуры, всегда передаются посредством указателей читай ByRef, поэтому явное указание ByRef для таки переменных не имеет смысла.
 
Автор темы Похожие темы Форум Ответы Дата
W Общие вопросы по AutoIt 16
Верх