2014-09-29 92 views
0

我的Ceasar转换密码程序出现问题。当我必须用n个移位密码来加密某些文本时,代码工作正常。但是当我想解密一些文本时,数组索引变为负数,并且出现错误:发生了类型为“System.IndexOutOfRangeException”的未处理的异常。Visual Basic转换密码

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 

回答

1

你的子例程工作。但是,您用作查找表的数组被声明为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子句来指示将返回什么类型的数据。

+0

代码工作得很好,当我必须增加每个字母一个,并且如果它超过了我的字母()数组中的索引,则由于模数而重新开始。但是相反,它不起作用,并且数组的值低于零。所以我不认为字母数组是问题所在? – 2014-09-30 09:02:51

0

可能导致该错误的一件事是数组索引太大或小于零。尝试在Visual Studio中运行该程序。出现错误时,显示停止的代码行中所有变量的值。 (使用调试菜单)。那么你应该看到问题。

+0

我知道它小于零,但我不知道如何防止它? 它工作得很好,当我必须增加每个字母一个,如果它超过了我的英文字母()数组中的索引,由于模数,它只是重新开始。但是相反,它不起作用,并且数组的值低于零。 – 2014-09-30 09:02:05

0

我想如果我添加我的alfabet()数组的长度为新的索引是负的 - 一切工作正常:-)

if nytTal < 0 Then 
nytTal += nytTal + alfabet.Length 
End If