Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Электронный конспект лекций информатика.docx
Скачиваний:
17
Добавлен:
15.04.2019
Размер:
705.89 Кб
Скачать

8.17. Передача параметров в процедуры

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

В общих процедурах количество и порядок используемых параметров определяется разработчиком. В заголовке процедуры можно указывать тип данных для параметров.

В VISAUL BASIC параметры могут передаваться двумя способами:

- либо как ссылки (ByRef)

- либо как значение (ByVal)

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

По умолчанию параметры в VISAUL BASIC передаются по ссылке, но можно указывать явно ключевое слово ByRef перед параметром в заголовке процедуры:

Sub pr1(ByRef n As String)

При передаче параметра по значению VISAUL BASIC передает копию содержимого переменной вместо ее адреса в памяти, и функция или процедура не сможет напрямую модифицировать исходное значение. Ключевое слово ByVal перед параметром должно указываться обязательно:

Function fkl(ByVal k As String) As Boolean

VISUAL BASIC позволяет использовать в процедурах именованные параметры и создавать процедуры, в списке которых могут присутствовать необязательные параметры.

Именованные параметры

Использование именованных параметров позволяет передавать часть или все параметры в любом порядке.

При вызове процедуры следует именовать параметры:

имя параметра:=значение

Пример:

Private Sub Summa(a,b,c)

c=a+b

End Sub

Private Sub Command1_Click()

Summac:=S,b:=val(Text1.Text),a:=val(Text2.Text)

Text3.Text=Str(S)

End Sub

При вызове процедуры можно передавать как неименованные, так и именованные параметры. Однако, при этом как только в списке появился именованный параметр, то все следующие за ним параметры также должны быть именованными.

Необязательные параметры

Необязательным является параметр, значение которого может не задаваться при вызове процедуры. Для того чтобы параметр стал необязательным, перед его именем ставится ключевое слово Optional. Все последующие параметры после первого необязательного параметра также должны быть необязательными.

Пример:

Sub Pr(a, Optional b)

If IsMissing(b) Then

Print a,b

Else

Print a

EndIf

End Sub

Private Sub Command1_Click()

Pr 1

Pr 1,2

End Sub

Примечание: В примере показаны два варианта вызова процедуры Pr. В процедуре Pr функция IsMissing проверяет передан или нет аргумент типа Variant.

8.18. Массивы статические и динамические.

Массив - это набор элементов определенного типа, каждый из которых имеет свой порядковый номер, называемый индексом. Различают массивы статические и динамические.

Границы статического массива устанавливаются на этапе разработки и могут изменяться только в новой версии программы.

Динамические массивы изменяют свои границы в ходе выполнения программы.

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

[Static| Public| Dim] Имя_массива([Нижн_предел To] Верхн_предел) [As Тип_данных]

Динамический массив создается в два этапа. Сначала массив определяют в секции (General) (Declarations) контейнера (Form, Module) без указания размера. Затем с помощью оператора ReDim устанавливают фактический размер массива:

Синтаксис оператора ReDim:

ReDim [Preserve] Имя_массива(Границы) [As Тип_данных]

В отличие от Dim оператор ReDim используется только в процедурах. При этом тип данных указывать не обязательно, особенно если он уже определен оператором Dim. Использование ключевого слова Preserve позволяет сохранить содержимое массива при изменении его размерности (однако, для многомерных массивов можно изменять только последнее измерение).

Пример:

'(General) (Declarations)

Dim a() As Variant

Private Sub Command1_Click()

ReDim Preserve a(5,10)

. . . . . . .

End Sub

Область видимости динамических массивов (контейнерных, глобальных) определяется способом их объявления:

Public – глобальный;

Dim - контейнерный.

При необходимости определения фактического размера массива используются встроенные функции:

Lbound(массив, размерность) - нижняя граница.

Ubound(массив, размерность) - верхняя граница.

Пример ввода данных в динамический массив:

Dim ms() As String

Private Sub Command1_Click()

Cls

ReDim ms(0)

s = "Начало работы"

Do Until s = ""

s = InputBox("введите фамилию")

ms(UBound(ms)) = s

ReDim Preserve ms(UBound(ms) + 1)

Loop

ReDim Preserve ms(UBound(ms) - 1)

For i = 0 To UBound(ms)

Print i; " "; ms(i)

Next i

End Sub

VISUAL BASIC позволяет использовать массив в качестве передаваемого в процедуру параметра и в качестве возвращаемого функцией значения.

Пример передачи массива в качестве параметра массива:

Public Sub srt(b() As Integer)

Dim i As Integer, f As Integer, k As Integer

Do

f = 0

For i = LBound(b) To UBound(b) - 1

If b(i) > b(i + 1) Then

k = b(i): b(i) = b(i + 1): b(i + 1) = k: f = 1

End If

Next

Loop While f = 1

End Sub

Private Sub Command1_Click()

Dim a(1 To 5) As Integer

Dim i As Integer

For i = 1 To 5

a(i) = Val(InputBox("Введите число"))

Next

Call srt(a)

Cls

For i = 1 To 5

Print a(i);

Next

End Sub

Пример функции, возвращающей массив:

Public Function VV(ByVal n As Byte) As Byte()

Dim x(1 To n) As Byte, i As Byte

For i = 1 To n

x(i) = Val(InputBox("Введите число"))

Next

VV=x

End Function

Private Sub Commnd1_Click()

Dim b() As Byte, i As Byte

B()=VV(10) ‘вызов функции

For i = 1 To 10

Print b(i)

Next

End Sub