Переменные, аргументы и флаги. Инструкция по эксплуатации.
Собственно с чего бы начать... Этот материал в общем случае вы проходили. Многие проходили его постигая шаг за шагом, на своих или приятельских ошибках, другие проходили это менеe трагическим путем, например прочитав где-либо. Ну, и , думается мне, что есть еще начинающие, которым что-то из нижесказанного может оказаться в новинку. Итак, переменные. все мы умеем ими пользоваться. Чего уж проще. Объявил и вперед. [Между строк - о негодяях, которые убирают из Declaration секции волшебные слова Option Explicit я вообще помолчу. Надеюсь среди вас их нет.] Вот и давайте подумаем о том, что делает Бэйсик при объявлении переменной? Правильно, выделяется физический кусок памяти строго заданного размера, и на этот кусок памяти ставится указатель. Зачем вообще это знать программисту на Бэйсике, раз среда сама управляет этим процессом? Затем хотя бы, чтобы понимать, что при обьявлении разных типов переменных отъедается разный размер памяти. соответственно это влияет на "прожорливость" приложения в целом. Кстати, неправильно выбранный размер переменной, используемой , например, в длинном цикле может замедлить выполнение этого цикла. Короче, в качестве совета - если есть возможность избегать использования переменных типа Variant, то пользуйтесь этой возможностью, и обьявляйте переменные как (в порядке предпочтения) Integer , Long , Currency, Single, Double Операции с Currency более точно производят округления, поэтому они предпочтительны при работе с деньгами. Dim I as Integer Подумали почему так выходит? Причина в способе Бэйсика преобразовывать одни типы данных в другие. (неявное приведение типов) Строка RES = I*J выполняется так 1. Взять ЦЕЛОЕ I Неприятно, но это работает именно так. Выводы: если вы ожидаете получение результата типа Long, позаботьтесь о заблаговременном преобразовании одного из аргументов. Например так RES = СLng(I)*J Для примера ССur(I) + J вернет результат типа Currency, попытка запихать значение в RES , которое имеет тип Long , пройдет успешно, но Бэйсик выполниет преобразование в лонг за вас. Что неплохо , но иметь в виду это надо. Есть еще проблемы с округлением, но на эту тему, кажется можно писать кандидатскую диссертацию. Так что, по возможности, используйте те типы переменных, которые отвечают текущим потребностям. Следующий аспект переменных, о котором надо сазать несколько слов - это область видимости и время существования. Теперь аргументы. Извечная проблемма - быть или не быть, то есть ByRef или ByVal. Как передавать аргументы? Сошлюсь на давнее письмо из Ru.VisualBasic From: Dmitry Shirokov (oes@cyberax.ru) Вот пример, отражающий главное различие между ByVal и ByRef Private Function TestSub1(ByVal ptr As Long) As Long Private Function TestSub2(ByRef ptr As Long) As Long Private Sub Form_Paint() Фактически функции TestSub1 и TestSub2 отличаются только способом пе- Что касается рекомендаций по применению - вот несколько примеров, где 1. При написании функции (или процедуры), которая возвращает более одного Во всех остальных случаях следует применять ByVal (это, кстати, может В общем случае - для всех числовых типов имеет смысл использовать Ну и последнее, о чем хотелось замолвить пару слов - это флаги. Флаги (не совсем легальный с точки зрения терминологии Бэйсика термин) это какие -то обозначатели, по сути дела, они могут иметь огранниченное чило значений, поэтому полноценной переменной не являются. Например в ходе вычислений пользователь нажал Cаncel. Программа должна быть прервана, но она не знает об этом, она продолжает считать - неплохая идея "поднять флаг" - установить значение переменной, а потом, в ходе вычислений его время от времени проверять. Относящееся к области видимости переменных одинаково хорошо подходит и для флагов. Очень полезны бывают перечисления - Enum. Перечисления - это набор констант, обьединенных в группу Например создадим Enum Week Private Enum Week И обьявим переменную такого типа Dim Test As Week После этого переменной Test пользоваться легко и приятно. Стоит набрать
Страница сайта http://silicontaiga.ru
Оригинал находится по адресу http://silicontaiga.ru/home.asp?artId=6479 |