Другие языки программирования и технологии

records и ByVal в VB

Добрый день. необходимо разобраться с данным кодом в VB. Такой вопрос - что значит records(0,index) и что значит ByVal?

Private Sub FillQuestion(quest As Question, records As Variant, ByVal index As Integer)
With quest
.Count = records(0, index)
.AnswerType = records(1, index)
.Text = records(2, index)
End With
End Sub

Private Type Question
Count As Integer
AnswerType As Integer
Text As String
Answers(0 To 3) As String
AnswerCode As String
End Type
ByVal это передача параметра по значению, а ByRef по ссылке.
ByVal приводит к тому, что для вводимой за ним переменной при вызове процедуры создаётся копия, которая исчезает по окончании работы процедуры и никак не может повлиять на значение переменной, для которой эта копия создаётся.
Для переменной ByRef (даётся по умолчанию) копия не создаётся. Значение переменной ByRef процедура может изменить, а значение переменной ByVal – нет.

Теперь по-русски. У тебя есть переменная index, которая определена где-то за пределами подпрограммы FillQuestion, и когда ты ее вызываешь из основной программы, ты пишешь: Call FillQuestion (quest, records, index)
Когда выполнение программы переходит к выполнению подпрограммы, оно встречает префикс ByVal index в заголовке.
При этом переменные quest и records задаются по умолчанию с префиксом ByRef, а index - с префиксом ByVal.
Это значит, что если переменная quest или records будет изменена внутри подпрограммы, то она так и останется измененной, когда выполнение вернется к основной программе, а переменная index при входе в подпрограмму копируется как-бы в другую переменную с тем же именем index, и с тем же старым значением, поэтому она может быть изменена сколько угодно, а при возврате в основную программу эта как-бы переменная стирается, и имя index возвращается к основной переменной и получает старое значение.

Теперь про records. Но здесь я уже менее уверен.
В заголовке подпрограммы FillQuestion (quest As Question, records As Variant, ByVal index As Integer)
ты задаешь переменную quest типа Question, который ты сам же и определил, переменную records типа Variant, то есть самонастраивающийся и переменную index типа Integer, то есть целое число.
Тип Variant означает то, что реальный тип переменной будет такой, какой ты задашь при первом обращении к переменной.
То есть, если ты напишешь records = 5, то records станет типа Integer, а если напишешь records = "Вася", то типа String.
Тип Question мы определяем самостоятельно как список переменных: Count типа целое, AnswerType типа целое, Text типа строка, Answers(0 To 3) - одномерный массив из 4 элементов типа строка, AnswerCode типа строка.
Records, как я понял - это массив, члены которого имеют разные типы.
В подпрограмме мы задаем, что Count - это число, равное значению records(0,index), AnswerType - это число, равное значению records(1,index), Text - это строка, равная значению records(2,index).
Вроде бы так.
Шамиль Каримов
Шамиль Каримов
81 532
Лучший ответ