Сдвиговый шифр Visual Basic

У меня проблема с моей программой шифрования смены Ceasar. Код работает нормально, когда мне нужно зашифровать текст с n шифрами сдвига. Но когда я хочу расшифровать некоторый текст, индекс массива становится отрицательным, и я получаю ошибку: произошло необработанное исключение типа 'System.IndexOutOfRangeException'.

Public Class Form1
Dim alfabet() As Char = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "æ", "ø", "å"}


Private Sub btnClose_Click(sender As Object, e As EventArgs) Handles btnClose.Click
    Me.Close()
End Sub



Private Sub btnKod_Click(sender As Object, e As EventArgs) Handles btnKod.Click

    Kod(txtDekodet.Text, txtTrylletal.Text, True)

End Sub


Private Sub btnDekod_Click(sender As Object, e As EventArgs) Handles btnDekod.Click

    Kod(txtKodet.Text, -txtTrylletal.Text, False)

End Sub

Function Kod(tekst As String, trylletal As Integer, skalKodes As Boolean)
    Dim nyeCharVaerdier(tekst.Length) As Char

    For i As Integer = 0 To tekst.Length - 1
        Dim nytTal As Integer = findIndex(tekst(i), trylletal)

        If nytTal = -1 Then
            nyeCharVaerdier(i) = tekst(i)

        Else
            nyeCharVaerdier(i) = alfabet(nytTal)
        End If

    Next
    If skalKodes = True Then
        txtKodet.Text = nyeCharVaerdier
    Else
        txtDekodet.Text = nyeCharVaerdier
    End If
    Return Nothing
End Function


Function findIndex(tegn As Char, trylletal As Integer) As Integer
    For alfabetTaeller As Integer = 0 To alfabet.Length - 1
        If tegn = alfabet(alfabetTaeller) Then
            Dim nytIndex As Integer = (alfabetTaeller + trylletal) Mod alfabet.Length
            Return nytIndex

        End If
    Next
    Return -1
End Function


End Class

3 ответа

Решение

Ваша подпрограмма работает. Однако массив, который вы используете в качестве таблицы поиска, объявлен как char, но вы пытаетесь заполнить его строками. Если у тебя есть Option Strict на, вы бы видели каждую строку с волнистой линией под ней, что указывает на ошибку. Положить c после закрытия "для каждого персонажа и ваша подпрограмма будет работать.

Dim alfabet() As Char = {"a"c, "b"c, "c"c, "d"c, "e"c, "f"c, "g"c, "h"c, "i"c, "j"c, "k"c, "l"c, "m"c, "n"c, "o"c, "p"c, "q"c, "r"c, "s"c, "t"c, "u"c, "v"c, "w"c, "x"c, "y"c, "z"c, "æ"c, "ø"c, "å"c}

На боковой ноте. Если вы не собираетесь возвращать какие-либо значимые данные, объявите процедуру как Sub а не как Function, Если вы собираетесь вернуть данные, используйте As предложение, чтобы указать, какой тип данных будет возвращен.

Единственное, что может вызвать эту ошибку, это когда индекс массива слишком велик или меньше нуля. Попробуйте запустить программу в Visual Studio. Когда он получит ошибку, отобразите значение всех переменных в строке кода, на которой он остановился. (Используйте меню отладки). Вы должны увидеть проблему тогда.

Я понял, что если я добавлю длину моего массива alfabet() к новым отрицательным индексам - все будет отлично работать:-)

if nytTal < 0 Then
nytTal += nytTal + alfabet.Length
End If
Другие вопросы по тегам