Разделение программы на процедуры/функции

Вот код, который я использую. Я пытаюсь организовать программу, разделив ее на процедуры и функции. Код работал, когда он не был разделен, однако, когда он у меня в этом формате ниже, текущее число становится 0. Нужно ли мне изменить UserInput на функцию вместо процедуры? Мне нужно обновить несколько значений и вернуть их в основную программу, поэтому я понятия не имел, как использовать это как функцию. Заранее спасибо за любую помощь, и я приношу свои извинения за свою неопытность, я все еще нахожусь на ранних стадиях изучения программирования в целом.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Call ExplanationOfGame()
    CurrentNumber = RandomNumber()
    Label2.Text = CurrentNumber
    While CurrentNumber <> 0
        Call UserInput(UserNumber, CurrentNumber, Answer)
        Call ComputerInput(ComputerNumber, CurrentNumber, Answer)
    End While
    Call DecideWinner(CurrentNumber, Answer)
End Sub

Sub UserInput(ByVal CurrentNumber As Integer, ByVal UserNumber As Integer, ByVal Answer As Integer)
    Answer = 1
    Do
        UserNumber = InputBox("Enter number to minus from the current number (1, 2 or 3). The current number is: " & CurrentNumber)
    Loop Until (CurrentNumber - UserNumber) >= 0
    CurrentNumber = CurrentNumber - UserNumber
    Label2.Text = CurrentNumber
    MsgBox("You took " & UserNumber & " away from the current number. The new current number is " & CurrentNumber)
End Sub

person Z epaa    schedule 18.11.2014    source источник
comment
Измените ваши ByVals на ByRefs.   -  person helrich    schedule 19.11.2014


Ответы (1)


В функции UserInput используйте ByRef вместо ByVal для параметров. ByVal передает только значение переменной, поэтому вы фактически не изменяете исходную переменную.

Другой вариант — превратить его в функцию и вернуть только CurrentValue. Кажется, вы передаете два параметра — UserNumber и Answer — которые не нужно передавать.

Вы можете изменить его на:

Function UserInput(CurrentNumber As Integer) As Integer
    ...
End Function

Затем вызовите его, используя:

CurrentNumber = UserInput(CurrentNumber)
person Community    schedule 18.11.2014
comment
Хорошо, так что я могу изменить подпрограмму на функцию? Возможно, что-то вроде этого?: «Функция UserInput (ByRef CurrentNumber, ByRef UserNumber, ByRef Answer)» - person Z epaa; 19.11.2014
comment
Нет, он может остаться сабом. Вы переходите к функции только в том случае, если хотите вернуть одно значение вместо изменения существующих переменных. - person ; 19.11.2014
comment
Я изменил все «ByVal» на «ByRef», но проблема не устранена? - person Z epaa; 19.11.2014
comment
Какую проблему вы получаете? Поставили ли вы точки останова в коде, чтобы пошагово пройти и посмотреть, передаются ли ожидаемые значения? - person ; 19.11.2014
comment
Извините, я не совсем уверен, как это сделать, код определенно работал, прежде чем я попытался разделить его на сабвуферы, поэтому я предположил, что проблема была в этом. CurrentNumber — это случайное число, представленное в Label2.text, и оно работает, однако в появившемся поле ввода currentNumber равно 0. Могу ли я отправить вам полный код, чтобы вы могли увидеть мои ошибки? - person Z epaa; 19.11.2014
comment
Только что обновил свой ответ, немного прочитав ваш код. Кажется, у вас есть некоторые ненужные вещи, которые можно было бы упростить. - person ; 19.11.2014
comment
Спасибо за обновление, смогу ли я изменить другие значения в коде? Поскольку мне нужно, чтобы переменная «Ответ» менялась по номеру, а также «Текущий номер», - person Z epaa; 19.11.2014
comment
О... у вас параметры в неправильном порядке. У вашей подпрограммы есть CurrentNumber, UserNumber, но вы вызываете ее с помощью UserNumber, CurrentNumber. - person ; 19.11.2014
comment
Ааа отлично, это сработало! Кажется, это довольно глупая ошибка: P Я должен помнить об этом сейчас, большое спасибо за вашу помощь, Филипп. - person Z epaa; 19.11.2014