С. Н. Лукин Самоучитель Том 1 (из 3) Все права защищены © 2005 Содержание Введение 5 Кому предназначена эта книга - страница 14

^ Переменные величины и память
Графиня отвела во дворце каждому гостю по комнате. Размер комнаты зависит от титула. Для нас дворец – это оперативная память, гости – переменные, а комнаты – так-называемые ячейки. Полностью механизм работы переменных величин не понять, если не узнать, как они хранятся в оперативной памяти компьютера.

Оперативная память нужна компьютеру для того, чтобы хранить во время выполнения программы саму эту программу и данные (в том числе переменные величины), с которыми программа работает. О работе памяти вы можете почитать. в Приложении 1.

При запуске проекта и позже компьютер под каждую переменную отводит в памяти место. Оно называется ячейкой. Во дворце размер комнат измеряют в квадратных метрах, в памяти размер ячейки выражают в байтах. Князю нужна более вместительная комната, чем барону. Переменной типа Double нужна более вместительная ячейка, чем переменной типа Integer. Так оно и есть на самом деле: под переменную типа Integer в памяти отводится ячейка размером 4 байта, а под переменную типа Double – 8 байтов. Только не думайте, что переменная типа Integer не может быть числом длиннее 4 цифр, а переменная типа Double не может быть числом длиннее 8 цифр. Компьютер использует для записи чисел в ячейки более компактную систему, чем для записи символов: в 1 байт умещаются две с лишним цифры числа.

Не думайте также, что «стенки» между ячейками в оперативной памяти физически стоят намертво, как стены между комнатами дворца. При выполнении каждого следующего проекта и даже в процессе выполнении одного и того же «дворец» перестраивается. Но нас не интересует физический уровень. Мы можем пока думать, что на всем протяжении «праздника» любая переменная спокойно живет в своей неизменной ячейке.
        1. ^ Что делает оператор присваивания с памятью

Я только что рассказывал о работе оператора присваивания, используя такие выражения, как «компьютер знает», «компьютер помнит» », «компьютер присваивает». Но нам необходимо более строгое понимание работы этого оператора, понимание ближе к «железу», к оперативной памяти.

Рассмотрим пример программы:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim a, b, y As Integer

a = 10

b = 6

y = a + b + 1

Debug.WriteLine(y + 200)

End Sub

В программе встречаются три переменные, все они объявлены. Компьютер отведет для них в памяти три четырехбайтовые ячейки. Вот как будет работать оператор присваивания:

Выполняя оператор присваивания (например, y=a+b+1), компьютер сначала смотрит на его правую часть (a+b+1). Если в ней встречаются переменные (в нашем случае это a и b ), то компьютер перед вычислением ищет их значения в отведенных ячейках памяти (и находит там 10 и 6, так как их туда перед этим записали операторы а=10 и b=6), подставляет эти значения в правую часть и вычисляет ее. Затем вычисленное значение (17) компьютер записывает в ячейку памяти, отведенную под переменную, поставленную в левой части (y).

Таким образом, когда мы говорим "Компьютер запомнил, что а равно 2", мы подразумеваем "Компьютер записал в ячейку памяти, предназначенную для а, число 2".

А теперь рассмотрим, как будут заполняться информацией ячейки a, b, y в процессе выполнения нашей программы. В самом начале выполнения программы в них находятся нули. Первым выполняется оператор а=10. Согласно только что приведенному определению оператора присваивания в ячейку a будет записано число 10. Затем выполняется оператор b=6 и в ячейке b появляется шестерка. Затем выполняется оператор y=a+b+1. Компьютер смотрит, что находится в ячейках a и b, видит там 10 и 6, подставляет их в выражение a+b+1, получает 17 и записывает в ячейку y. Наконец выполняется оператор Debug.WriteLine(y+200). Компьютер заглядывает в ячейку y, видит там 17, вычисляет 17+200 и выводит 217 в окно Output.

Схематически этот процесс можно изобразить так (время течет сверху вниз):

    ^ ПОРЯДОК ИСПОЛНЕНИЯ ОПЕРАТОРОВ

    ЧТО НАХОДИТСЯ В ЯЧЕЙКАХ ПАМЯТИ

    ЧТО ВИДИМ

    В ОКНЕ

    Output

    Ячейка для a

    Ячейка для b

    Ячейка для y



    0

    0

    0



    a=10

    10

    0

    0



    b=6

    10

    6

    0



    y=a+b+1

    10

    6

    17



    Debug.WriteLine (y + 200)

    10

    6

    17

    217

Теперь мы можем также уточнить работу оператора Debug.WriteLine:

Если в операторе Debug.WriteLine встречаются выражения с переменными величинами, то VB находит в памяти значения этих величин, подставляет их в выражения, вычисляет выражения и результат выводит на экран. В память же ничего нового не записывается.



Ответьте устно, что произойдет, если поменять местами операторы b=6 и y=a+b+1?
        1. ^ Режим прерывания. Пошаговый режим выполнения программы

Компьютер выполняет программу со страшной скоростью. Не успели мы нажать кнопку – а результаты уже получены. Если дела идут нормально, этот факт нас восхищает. Но предположим, что результаты получились не те, что нам надо. Это значит, что в программе есть ошибки. И искать их трудно. В такой ситуации скорость компьютера начинает раздражать. Хотелось бы, чтобы компьютер работал помедленнее и мы успевали проследить за его работой. И хорошо бы как-нибудь во время работы подсмотреть значения переменных в памяти, это помогло бы найти ошибку. Режим прерывания для этого и предназначен. Подробно о режиме прерывания и об отладке программы поговорим в Error: Reference source not found, а сейчас вкратце и без особых пояснений остановимся на самом необходимом.

Щелкните в нашем проекте по вертикальной серой полосе в левой части окна кода против строки заголовка процедуры. На полосе появится черная точка и вся строка будет выделена черным (см. Рис. 5 .96). Была создана так называемая точка прерывания (Breakpoint). Убираются точки прерывания так же, как и ставятся – щелчком мыши.



Рис. 5.96

Запустите проект обычным образом (кнопка Start или клавиша F5). Проект начнет выполняться как обычно. На экране появится форма. Нажмите, как водится, кнопку Button1. И тут вы почувствуете разницу. Вместо того, чтобы полностью выполниться и показать результат, проект остановится на точке прерывания, в знак чего эта строка окажется подсвечена желтым цветом и на нее укажет желтая стрелка (Рис. 5 .97). Итак, только-только начав выполняться, наш проект «замерз» до тех пор, пока мы его не разморозим. «Мгновение остановилось». Говорят, что проект перешел в так называемый режим прерывания.



Рис. 5.97

Интересно, чему во время остановки равны значения переменных в памяти компьютера? Для того, чтобы узнать это, достаточно поместить не нажимая мышиный курсор на обозначение переменной в тексте процедуры в окне кода – во всплывающей подсказке вы увидите значение переменной (на Рис. 5 .97 вы видите, что y=0). Поводите мышью по переменным. Как и положено, пока «на табло одни нули».

Продолжим выполнение проекта не кнопкой Start, как привыкли, а клавишей F11 на клавиатуре. Это горячая клавиша для ^ Debug  Step Into (кстати, если ваш профиль настроен на Visual Basic 6, то горячей клавишей будет F8, а не F11). Ничего не происходит, только полоса подсветки прыгает на строку a = 10. Операторы Dim выполняются заранее, поэтому полоса подсветки через оператор Dim перепрыгнула.

F11. VB выполняет a = 10, а следующий оператор подсвечивается. Проверьте мышкой, чему сейчас равны a, b, y в памяти.

F11. VB выполняет b = 6, а следующий оператор подсвечивается. Проверьте, чему сейчас равны a, b, y в памяти.

Итак, правило простое – при нажатии на F11 VB выполняет очередной оператор программы и подсвечивает тот оператор, которому предстоит быть выполненным.

Обратите внимание, что сменился режим VB. Мы знаем пока два режима: режим проектирования [design] и режим работы [run]. Теперь в заголовке главного окна VB вы видите слово [break]. Это означает, что VB сейчас находится в режиме прерывания. Можно сказать, что режим прерывания – это режим существования проекта, когда выполнение программы прервано, но не закончено. Когда вы нажимаете на F11, вы приказываете Бейсику останавливаться на каждом операторе. Такая разновидность режима прерывания называется пошаговым режимом. Режим прерывания можно настроить и на более редкие остановки.

F11. VB выполняет y = a+b+1, а следующий оператор подсвечивается. Проверьте, чему сейчас равны a, b, y в памяти.

F11. VB выполняет Debug.WriteLine (y + 200), а следующий оператор подсвечивается. В окне Output возникает число 217.

F11. Подсветка уходит, так как процедура выполнена. Можно снова жать на кнопку ^ Button1.

Итак, компьютер сделал все то, что сделал бы при нажатии Start, но только в медленном темпе.

В любой момент пошагового выполнения программы вы можете вместо ^ F11 нажать Start, которая по такому случаю переименовывается в Continue, и программа продолжит выполняться в обычном режиме.

Когда VB находится в режиме прерывания, на экране вы видите панель инструментов для отладки – Debug (Рис. 5 .98).



Рис. 5.98

Когда вам вздумается завершить отладку, вы можете сделать это привычным способом, закрыв форму крестиком, а можете и нажать кнопку Stop Debugging на панели Debug (она имеет форму черного квадратика). Если панели Debug не видно, поместите ее туда обычным образом: View  Toolbars  Debug.

Замечание: При отладке в пошаговом режиме вам часто нужно на экране видеть одновременно главное окно VS и саму запущенную форму. Но при нажатии на F11 форма часто пропадает из вида, будучи закрыта другими окнами. Чтобы этого не происходило, еще до начала отладки главное окно VS уменьшите до части экрана. Затем после запуска отладки перетащите форму на освободившуюся часть экрана. Тогда окно VS не будет перекрывать форму и проблема исчезнет.
        1. ^ Оператор присваивания меняет значения переменных величин

Пока я не рассматривал программы, в которых переменные меняют свою величину. Теперь настало время такую программу рассмотреть:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim k As Integer

k = 10

Debug.WriteLine(k)

k = 25

Debug.WriteLine(k)

k = 4

Debug.WriteLine(k)

End Sub

В процессе работы программы содержимое ячейки k меняется. Так, при выполнении оператора k=25 там вместо значения 10 появляется 25. А куда же девается десятка? Она стирается, то есть компьютер забывает ее безвозвратно. Здесь действует общий принцип работы всех компьютеров:

Если в какую-нибудь ячейку или вообще в какое-нибудь место памяти или диска записывается новая информация, то старая информация, записанная там раньше, автоматически стирается, даже если она кому-то и нужна.

Раз теперь вместо 10 в ячейке k находится 25, то оператор Debug.WriteLine(k) печатает уже 25. (Слово «печатает» устарело, оно осталось от тех времен, когда мониторов еще не было, а вместо них были принтеры. Когда я по старинке говорю, что информация печатается, я подразумеваю, что она появляется на мониторе в том или ином окне.) Следующий оператор k=4 запишет на место 25 четверку, а Debug.WriteLine(k) ее напечатает. Проверьте.

Запишем схематически процесс изменения информации в ячейке k:

    ^ ПОРЯДОК ИСПОЛНЕНИЯ ОПЕРАТОРОВ

    ЧТО НАХОДИТСЯ В ЯЧЕЙКЕ ПАМЯТИ k

    ЧТО ВИДИМ

    В ОКНЕ Output

    k=10

    10



    Debug.WriteLine(k)

    10

    10

    k=25

    25



    Debug.WriteLine(k)

    25

    25

    k=4

    4



    Debug.WriteLine(k)

    4

    4



А что напечатает следующая программа?

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Dim f As Integer

f = 30

Debug.WriteLine(f)

f = f + 4

Debug.WriteLine(f)

End Sub

Оператор f=30 запишет в ячейку f число 30. Затем оператор Debug.WriteLine(f) напечатает 34. А что сделает странный оператор f=f+4 ? Не думайте, что это уравнение или что-нибудь в этом роде. Это оператор присваивания, а значит и выполнится он согласно определению оператора присваивания. Сначала VB вычислит правую часть f+4 , подставив туда вместо f его значение, взятое из ячейки, и получит 34. Затем число 34 будет записано в ячейку, отведенную под переменную, обозначенную в левой части, то есть опять же в ячейку f. При этом старое значение 30 будет стерто. Оператор Debug.WriteLine(f) напечатает 34.

Таким образом, оператор f=f+4 просто увеличивает число в ячейке f на четверку или, другими словами, увеличивает f на 4.

Зачем это нужно? Узнаете позже. Очень даже нужно. Операторы такого типа встречаются настолько часто, что для них даже придумали сокращенную запись. Потренируемся:

Оператор

^ Сокращенная запись

Действие

a = a + 1

a += 1

Переменная увеличивается на 1

s = s - 25

s -= 25

Переменная уменьшается на 25

b = b * 2

b *= 2

Переменная увеличивается в 2 раза

t = t / 3

t / = 3

Переменная уменьшается в 3 раза





Определите без компьютера, что будет напечатано при выполнении следующих фрагментов программ:
        1. ^ Имена переменных. Ключевые слова VB

Как правильно давать имена элементам VB, мы уже говорили. Повторю:

Имя может состоять из букв, цифр и знаков подчеркивания, причем не должно начинаться с цифры. И не должно состоять из одних подчеркиваний.

Правда, в VB имя определяется несколько более широко, но то правило, которое я дал, можно считать хорошим советом.

В школе переменные величины мы привыкли обозначать буквами (a, s, d ... ). Большинство языков программирования, в том числе и VB, позволяет обозначать переменные именами из многих букв. Вот два равносильных фрагмента программы:

    a=3;

    Summa=3;

    b=4+a;

    ШУРА=4+Summa;

    Debug.WriteLine(a, b)

    Debug.WriteLine(Summa, ШУРА)

В том и другом случае будут напечатаны числа 3 и 7. Очевидно, компьютеру все равно, какими именами мы обозначаем переменные величины или другие элементы, в смысл имен он не вдумывается и не удивляется, что переменная Summa никакой суммой не является, а просто числом 3.

Примеры правильной записи имен:

a

s25

oshibka

polnaja_Summmma

_1

__________tri_plus_dva__a1b88qqQQQQQQQQQQQQ

_Это_не_имя_Уж_поверьте

Примеры неправильной записи имен:

polnaja summa

содержится символ (пробел), не являющийся буквой, цифрой или знаком подчеркивания

1

начинается с цифры

8as

начинается с цифры

Domby&Son

содержится символ & , не являющийся буквой, цифрой или знаком подчеркивания

^ Это верное имя Да да да

содержится символ (пробел), не являющийся буквой, цифрой или знаком подчеркивания

VB игнорирует в именах разницу между строчными и прописными буквами. Так, для него ^ Summa и sUmmA – одно и то же имя. Но он присматривает за тем, чтобы в окне кода данное конкретное имя было написано всегда одинаково, а именно так, как объявлено (правда, я не уверен, что он так присматривает за всеми русскими буквами, во всяком случае Visual Basic 6.0 не всегда присматривал).

Ключевые слова. Ключевые слова (Keywords) – это служебные слова VB, которые он широко использует в тексте программы. Мы уже знакомы с некоторыми из них: Dim, Integer, Double, Sub и др. В нижеприведенной таблице перечислены все ключевые слова VB.

    AddHandler

    AddressOf

    Alias

    And

    AndAlso

    Ansi

    As

    Assembly

    Auto

    Boolean

    ByRef

    Byte

    ByVal

    Call

    Case

    Catch

    CBool

    CByte

    CChar

    CDate

    CDec

    CDbl

    Char

    CInt

    Class

    CLng

    CObj

    Const

    CShort

    CSng

    CStr

    CType

    Date

    Decimal

    Declare

    Default

    Delegate

    Dim

    DirectCast

    Do

    Double

    Each

    Else

    ElseIf

    End

    Enum

    Erase

    Error

    Event

    Exit

    #ExternalSource

    False

    Finally

    For

    Friend

    Function

    Get

    GetType

    GoTo

    Handles

    If

    Implements

    Imports

    In

    Inherits

    Integer

    Interface

    Is

    Let

    Lib

    Like

    Long

    Loop

    Me

    Mod

    Module

    MustInherit

    MustOverride

    MyBase

    MyClass

    Namespace

    New

    Next

    Not

    Nothing

    NotInheritable

    NotOverridable

    Object

    On

    Option

    Optional

    Or

    OrElse

    Overloads

    Overridable

    Overrides

    ParamArray

    Preserve

    Private

    Property

    Protected

    Public

    RaiseEvent

    ReadOnly

    ReDim

    #Region

    REM

    RemoveHandler

    Resume

    Return

    Select

    Set

    Shadows

    Shared

    Short

    Single

    Static

    Step

    Stop

    String

    Structure

    Sub

    SyncLock

    Then

    Throw

    To

    True

    Try

    TypeOf

    Unicode

    Until

    Variant

    When

    While

    With

    WithEvents

    WriteOnly

    Xor

    #Const

    #ExternalSource

    #If...Then...#Else

    #Region

    -

    &

    &=

    *

    *=

    /

    /=

    \

    \=

    ^

    ^=

    +

    +=

    =

    -=







Очевидно, придуманные вами имена не должны совпадать с ключевыми словами VB, иначе возникнет путаница. VB старается присматривать за этим и может указать вам на ошибку, если вы случайно используете ключевое слово в качестве имени. Если вам все-таки необходимо это сделать, возьмите имя в квадратные скобки, например, так:

Dim [Sub] As Integer

[Sub] = 99

Я также не рекомендую использовать на первых порах в качестве имен для создаваемых вами переменных имена популярных объектов, их свойств, методов и др. Например, если вы назовете переменную именем Button1, BackColor или WriteLine, то VB, может, и не спутается, но спутаетесь вы.

Называем по-русски. Взгляните в текст любой программы. Он состоит в основном из ключевых слов на английском (на латинице) и имен. Причем и тех и других так много, что глаза разбегаются и непонятно, где ключевое слово, а где имя. А если это имя – то создано ли оно программистом или взято из библиотеки классов .NET Framework – сразу не поймешь. Нам, русскоязычным, здесь удобнее: мы можем имена давать на русском (на кириллице). Разница между английскими и русскими буквами сразу бросается в глаза и разбирать текст программы становится не в пример легче: все, что мы создали сами, названо по-русски, а все, что досталось от VB – по-английски. Я так и делаю.

      1. 5000641561883056.html
        5000678951373762.html
        5000764717829984.html
        5000838938248476.html
        5000876969137361.html