Странный порядок следования

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Странный порядок следования

Сообщение pronto » 20.02.2012 (Пн) 15:38

Доброго времени суток, уважаемые форумчане!

Впервые столкнулся с таким странным поведением алгоритма...
Если кратко, то проблема в нарушении порядка следования при выходе из цикла.
Вызывается процедура, в теле которой выполняется цикл. Цикл прокручивается до
конца и происходит непонятный переход в вызывающую процедуру. Всё, что после Next
не выполняется.
Зависаний и ошибок нет...
Могу выложить кривую процедуру, если будет интересно посмотреть на неё.

PS: Через 2 минуты после размещения темы проблема была решена, но вопрос «Почему?» остался
Было
Код: Выделить всё
For i = 0 To Section_Len
   ...
Next i


Cтало
Код: Выделить всё
For i = 0 To Section_Len - 1
   ...
Next i
Последний раз редактировалось pronto 20.02.2012 (Пн) 15:45, всего редактировалось 1 раз.
O, sancta simplicitas!

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Странный порядок следования

Сообщение Debugger » 20.02.2012 (Пн) 15:40

pronto писал(а):Могу выложить кривую процедуру, если будет интересно посмотреть на неё.

Давай.
Так-то ничего не понятно.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Странный порядок следования

Сообщение pronto » 20.02.2012 (Пн) 15:50

Debugger писал(а):Давай

Да, пожалуйста! :)
Код: Выделить всё
   Dim fn As Long

   fn = FreeFile
   Open pFilePath For Binary Access Read Lock Write As #fn
   
      C2K_File = Space$(LOF(fn))
      Get #fn, 1, C2K_File
   
   Close #fn
   
   Dim Section_End As Long, Section_Start As Long, Section_Len As Long
   Dim i As Long, j As Long
   Dim PartNumber As Long ' номер раздела
   
   Dim Numb_Start As Long, Desc_Start As Long
   
   Dim PrevChar As Byte
   
   ' проверка файла на принадлежность
   If InStr(1, C2K_File, "Конфигурация") Then
   
      Section_Start = InStr(1, C2K_File, "[Разделы]")
     
      If Section_Start Then
         
         Section_End = InStr(Section_Start + 9, C2K_File, "[")  '  прибавляется длина имени секции
         Section_Len = Section_End - Section_Start
         
         Dim BinSection() As Byte
         ReDim BinSection(Section_Len)
         
         ' чтобы на один символ строки стал приходиться один байт памяти
         BinSection = StrConv(Mid$(C2K_File, Section_Start, Section_Len), vbFromUnicode)
         
         ' резервирование под имена разделов
         PartSD = 511
         ReDim SectionDescription(PartSD)
         
         For i = 0 To Section_Len ' Section_End - i + 10 'Section_End
           
            If BinSection(i) = c_colon Then
               ' найден новый раздел
               
               Numb_Start = 0
               Desc_Start = 0
               
               Do
                  i = i + 1
                 
                  Select Case BinSection(i)
                  Case c_carriage ' <конец_строки>
                     
                     Exit Do
                     
                  Case c_quote ' <">
                     ' начало или конец описания
                     
                     If Desc_Start = 0 Then
                        Desc_Start = i + 1
                     Else
                        ' поместить описание раздела в массив под соответствующим номером
                        If PartNumber = PartSD Then
                           PartSD = PartSD * 2
                           ReDim Preserve SectionDescription(PartSD)
                        End If
                       
                        SectionDescription(PartNumber) = Mid$(C2K_File, Section_Start + Desc_Start, i - Desc_Start)
                        Debug.Print PartNumber, SectionDescription(PartNumber)
                       
                     End If
                     
                  Case c_comma ' <,>
                     ' закончился номер раздела
                     PartNumber = CLng(Val(Mid$(C2K_File, Section_Start + Numb_Start, i - Numb_Start)))
                     
                  Case 48 To 57 ' числа
                     ' начался или продолжился номер раздела
                     
                     If Numb_Start = 0 Then
                        Numb_Start = i
                     End If
                     
                  End Select
                 
               Loop
               
            End If
           
         Next i
         
         MsgBox "Выход из цикла"

         ' отобразить имя файла и восстановить цвет текста
         Label2.Caption = pFilePath
         Label2.ForeColor = vbBlack

         CanCreateTable = CanCreateTable + 1
         
         ParseSection33 = "Завершено полностью"
         
      Else
         C2K_File = ""
         
         MsgBox "Секция с Разделами не найдена!", vbCritical, "Ошибка содержимого"
      End If
   
   Else
      MsgBox "Выбранный файл не является конфигурационным файлом.", vbCritical, "Файл не соответствует"
   End If
O, sancta simplicitas!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Yandex-бот и гости: 11

    TopList