2011-12-17 7 views
1

このコードを実行すると、「ミスマッチタイプ」と表示されるダイアログボックスが表示されます(For i = 0 To UBound(arffArray))。私のコードの問題は何ですか?ビジュアルベーシック6.0のミスマッチエラーを解決しました。

Public Function processFile() 

    Dim i, j, posRelation, temp, att, data, flag 
    Dim strRelation 
    Dim strAtt 
    Dim strData 

    strRelation = "@relation" 
    strAtt = "@attribute" 
    strData = "@data" 

    att = 0 
    data = 0 

    For i = 0 To UBound(arffArray) 
     If (InStr(arffArray(i), strRelation)) Then 
      temp = Replace(Mid(arffArray(i), 11, Len(arffArray(i))), "'", "") 
      RelationName = temp 
     ElseIf (InStr(arffArray(i), strAtt)) Then 
      flag = parseAtt(att, arffArray(i)) 
      If (Not flag) Then 
       processFile = flag 
       Exit Function 
      End If 
      att = att + 1 
     ElseIf (InStr(arffArray(i), strData)) Then 
      data = readTheRest(i) 
      i = UBound(arffArray) 'end the loop 
      totalData = data 
     End If 
    Next 

    'get the list of class name 
    Dim tmpClassAttr 
    tmpClassAttr = attArray(1, UBound(attArray, 2)) 

    For i = 0 To UBound(tmpClassAttr) 
     ReDim Preserve classArray(i) 
     classArray(i) = Trim(tmpClassAttr(i)) 
    Next 

    processFile = True 
End Function 

'------------------------------------------------------------ 
'Function: parseAtt(num, attrData, ByVal m As MineKnow) 
'require: 
' >@num  -> current attribute counter 
' >@attrData -> current attribute declaration 
'Raises: error if reading non numeric data/attribute 
'Return: boolean parseAtt TRUE/FALSE, TRUE if parse successfully or otherwise 
'Effect: parsing file content to: 
' > attributes 
'------------------------------------------------------------ 
Private Function parseAtt(num, attrData) 
    Dim temp, i, j, strAtt, temp2, pos, atVal 
    ReDim Preserve attArray(2, num) 

    'possible type of declarations 
    '@attribute outlook {sunny, rainy, overcast} 
    '@attribute outlook {sunny,rainy,overcast} 
    'attribute pos = 12 

    'get the attribute name first get the pos of "{" 
    pos = InStr(1, attrData, "{", 1) 

    If (pos = 0) Then 
     error = "---->Nominal attribute only." & vbCrLf & "---->" & attrData 
     parseAtt = False 
     Exit Function 
    Else 
     strAtt = Trim(Mid(attrData, 12, pos - 12)) 
     atVal = Mid(attrData, pos + 1, Len(attrData) - (pos + 1)) 

     atVal = Replace(atVal, "'", "") 
     atVal = Replace(atVal, "''", "") 
     atVal = Replace(atVal, "}", "") 
     atVal = Replace(atVal, " ", "") 

     temp = Split(atVal, ",") 

     attArray(0, num) = strAtt 
     attArray(1, num) = temp 
     parseAtt = True 
    End If 
End Function 
+2

arffArrayはどのように定義されていますか? – UnhandledExcepSean

+0

あなたは**使用しています** Option Explicit *、右ですか? – MarkJ

+0

はい。私は明示的なオプションを使用しています。 arffArrayはまだ別の部分をコーディングしています。私はそれを書きませんでした。 – tontontv

答えて

4

コードの最大の問題は、変数の型を宣言していないことです。

Dim i 

よう

ステートメントはちょうどあなたが何をしたい間違いないタイプVariant、として変数iを宣言します。

実際にiIntegerと宣言します。

Dim i As Integer 

ForループはタイプIntegerとイテレータインデックス変数を期待しているので、これはそのエラーを窒息からそれを停止する必要があります:あなたは、明示的に宣言の時点でタイプを指定することでことを成し遂げます。

Dim strRelation As String 

注あなたは(おそらく明確さの理由のために、やるべきではない)、単一の行に複数の変数を宣言していること:同様に、文字列は常にString型として明示的に宣言する必要があります

各変数にタイプを指定する必要があります。他の言語のように累積的ではありません。

例えば、この文

Dim i, j, k As Integer 

のみkIntegerなどを宣言します。 ijのタイプはVariantで、これはほぼ確実にあなたが望むものではありません。 VB 6あなたは0ではないという下限で変数を使用することができますので、

は代わりに、あなたはそれがコードにおそらく最高だ、この特定のケースではもちろん

Dim i As Integer, j As Integer, k As Integer 

を記述する必要があります

Dim i As Integer 
For i = LBound(arffArray) To UBound(arffArray) 
    ' Do something with the array 
Next i 
+0

良いアドバイスはありますが、エラーについては説明しません。 arffArrayが原因だと思われます。おそらく**配列ではない**でしょうか? – MarkJ

+0

私はCodyが言っていることは、UBOUNDがIntegerを返すので、一度IntegerとしてDIMを実行すると、tonberryのコードは動作する(または少なくとも良いチャンスがある)ということです。 – Aaron

+0

しかし、Dim i As Integerを追加するときも同じ問題があります。 – tontontv

関連する問題