2011-12-17 3 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 

просто объявить переменную i как тип Variant, который, безусловно, не то, что вы хотите.

Вы действительно хотите, чтобы i был объявлен как Integer. Вы выполнить это, явно указав тип в момент декларации:

Dim i As Integer 

Поскольку цикл For ожидает индексные переменный итератора с типом Integer, это должно остановить его от засорения этой ошибки.

Аналогично, строки должны всегда быть объявлены в явном виде String типов:

Dim strRelation As String 

Обратите внимание, что при объявлении нескольких переменных на одной линии (которые вы, вероятно, не следует делать, для ясности) , вам необходимо убедиться, что вы укажете тип для каждой переменной. Это не кумулятивно, как другие языки.

Например, это утверждение

Dim i, j, k As Integer 

объявит толькоk как Integer. i и j будут иметь тип Variant, что почти наверняка (опять же) не то, что вы хотели.

Вместо этого вам нужно написать

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

Конечно, в данном случае, так как VB 6 позволяет использовать переменные с нижней границей, что не 0, то, вероятно, лучше кода петля вот так:

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

Весь хороший совет, но не объясняет ошибку. Похоже, что причиной является arffArray. Может быть, это не массив **? – MarkJ

+0

Я думаю, что, как говорит Коди, это то, что, поскольку UBOUND возвращает Integer, код tonberry будет (или, по крайней мере, имеет больше шансов) работать, как только DIM i i будет Integer. – Aaron

+0

, но когда я добавляю Dim i As Integer также имеет такую ​​же проблему. – tontontv