Процедуры вызова Visual Basic

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

Однако теперь, когда я определил функции и процедуры, у меня возникли проблемы с вызовом процедур из «основной» процедуры. Ниже мой код:

Dim alphabet As String = "abcdefghijklmnopqrstuvwxyz "
Dim cipherText As String = "abcdefghijklmnopqrstuvwxyz "
Dim charPos As Integer = 0
Dim Cipher As String = ""
Dim Decoded As String = ""

Function userMessage()
    'User inputs message
    Dim message As String
    Console.WriteLine("Please input your message")
    message = Console.ReadLine()
    Return message
End Function

Function userKey()
    'User inputs key
    Dim key As Integer
    Console.WriteLine("Please enter your key")
    key = Console.ReadLine()
    Return key
End Function

Sub encodeMessage(ByRef message, ByRef key)
    cipherText = cipherText.Substring(key) & cipherText.Substring(0, key) 'Reorder based on key
    'Encode message
    For i = 0 To message.Length - 1
        charPos = alphabet.IndexOf(message(i))
        Cipher = Cipher & cipherText(charPos)
    Next i
    Console.WriteLine(Cipher)
End Sub

Sub decodeMessage(ByRef message, ByRef key)
    cipherText = cipherText.Substring(key) & cipherText.Substring(0, key) 'Reorder based on key
    'Decode message
    For i = 0 To Cipher.Length - 1
        charPos = cipherText.IndexOf(Cipher(i))
        Decoded = Decoded & alphabet(charPos)
    Next i
    Console.WriteLine(Decoded)
End Sub

Sub Main()
    userMessage()
    userKey()
    encodeMessage()
    decodeMessage()
    Console.ReadLine()

End Sub
End Module

Проблема, которую я обнаружил, заключается в процедуре main, где я пытаюсь вызвать две процедуры encodeMessage и decodeMessage, которые мне говорят

Не указан аргумент для параметра message в Public Sub encodeMessage

и он также показывает ту же ошибку для key.

Я попытался вставить его туда, например, encodeMessage(key, message), и я получаю сообщение об ошибке

key и message не объявлены.

Затем я объявлю их в основной функции, такой как Sub Main(ByRef key, ByRef message), однако затем я получаю другую ошибку, говорящую

Не найден доступный метод 'Main' с соответствующей сигнатурой.

Это очень расстраивает, и я был бы очень признателен за помощь в этом (p.s., я очень новичок в Visual Basic).

Спасибо,


person Community    schedule 20.03.2016    source источник
comment
Начните с включения опции strict. Затем зафиксируйте возврат функций в main, чтобы вы могли передать их: Dim key = userKey() . Этот новый локальный ключ является одним из параметров, которые вы определили для encodeMessage, но не передаете   -  person Ňɏssa Pøngjǣrdenlarp    schedule 20.03.2016
comment
Не могли бы вы немного уточнить для меня, пожалуйста? я все еще в замешательстве. Я изменил процедуры encodeMessage и decodeMessage на функции и вернул закодированные и декодированные сообщения, но я не вижу никаких изменений? Я все еще получаю сообщение об ошибке «Нет доступного основного метода».   -  person    schedule 20.03.2016
comment
не меняйте подпись для main; но соберите эти переменные в main   -  person Ňɏssa Pøngjǣrdenlarp    schedule 20.03.2016
comment
Ах, я думаю, я понимаю, что вы сейчас говорите, экспериментировал с этим последние несколько минут, и, похоже, теперь это имеет значение, просто пытаясь заставить его давать правильные результаты. Большое спасибо за помощь :)   -  person    schedule 20.03.2016
comment
Эй, у меня есть еще один вопрос, не могли бы вы помочь? Я пытаюсь проверить свои пользовательские вводы на ошибки, чтобы они принимали только действительные входные данные и чтобы приложение не ломалось, например, при вводе сообщения. Я знаю о функциях try и catch, но я не могу понять, как заставить его зацикливать ввод, пока пользователь не введет, например, строку, а не целое число? Не могли бы вы дать мне пример кода, как это будет работать?   -  person    schedule 21.03.2016
comment
Try/Catch не предназначен для проверки или управления потоком. См. stackoverflow.com/a/36117592/1070452 всего 3 часа назад.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 21.03.2016
comment
Не уверен, почему за этот вопрос проголосовали. Это похоже на вопрос новичка, но он имеет код и четко описывает проблему и то, что пытались решить.   -  person Chris Dunaway    schedule 21.03.2016


Ответы (1)


Я просто добавил сообщения и ключевые переменные как глобальные, снял сообщение ByRef, ключевые параметры ByRef из функций кодирования и декодирования

Это должно заставить его работать

Наслаждаться!

Dim alphabet As String = "abcdefghijklmnopqrstuvwxyz "
Dim cipherText As String = "abcdefghijklmnopqrstuvwxyz "
Dim charPos As Integer = 0
Dim Cipher As String = ""
Dim Decoded As String = ""
Dim message As String = ""
Dim key As Integer= ""

Function userMessage()
    'User inputs message
    Console.WriteLine("Please input your message")
    message = Console.ReadLine()
End Function

Function userKey()
    'User inputs key
    Console.WriteLine("Please enter your key")
    key = Console.ReadLine()
End Function

Sub encodeMessage()
    cipherText = cipherText.Substring(key) & cipherText.Substring(0, key) 'Reorder based on key
    'Encode message
    For i = 0 To message.Length - 1
        charPos = alphabet.IndexOf(message(i))
        Cipher = Cipher & cipherText(charPos)
    Next i
    Console.WriteLine(Cipher)
End Sub

Sub decodeMessage()
    cipherText = cipherText.Substring(key) & cipherText.Substring(0, key) 'Reorder based on key
    'Decode message
    For i = 0 To Cipher.Length - 1
        charPos = cipherText.IndexOf(Cipher(i))
        Decoded = Decoded & alphabet(charPos)
    Next i
    Console.WriteLine(Decoded)
End Sub

Sub Main()
    userMessage()
    userKey()
    encodeMessage()
    decodeMessage()
    Console.ReadLine()

End Sub
End Module
person Dr Yunke    schedule 20.03.2016