На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Как можно сравнить строку с массивом?
    имеется строка которую нужно сравнить с массивом строк. Массив наращивается и когда достигает больших размеров (более 2000 строк) то сравнение которое использую я очень медленное.
    ExpandedWrap disabled
          Do
              sort = sort + 1
              If pass(sort) = pass_new Then GoTo 1
          Loop Until sort = i
       
      где i это текущее кол-во строк в массиве, а sort сравниваемая строка
      Предложение: массив упорядочить, сравнение проводить методом деления пополам.
        Ну и вместо Goto лучше Exit Do использовать, что ли...
          Хммм.. А где постановка задачи? Чего требуется то?

          PS: Ненавижу GoTo /Except On Error statement/
            Цитата Spectr-7 @
            имеется строка которую нужно сравнить с массивом строк. Массив наращивается и когда достигает больших размеров (более 2000 строк) то сравнение которое использую я очень медленное.
            ExpandedWrap disabled
                  Do
                      sort = sort + 1
                      If pass(sort) = pass_new Then GoTo 1
                  Loop Until sort = i
               
              где i это текущее кол-во строк в массиве, а sort сравниваемая строка

            Сравнение даже намного более большего количества строк происходит очень быстро. Что для тебя быстро? Как часто ты проводишь проверку?
              Задача сгененировать до 25000 различных паролей. Максимум 24 символа в каждом. Генерируется пароль посимвольно, потом идет проверка - есть ли такой пароль в уже созданных.

              ExpandedWrap disabled
                Dim i, a, comp, rnd_s, sort  As Integer
                Dim pass_new As String
                 
                i = 0
                Do
                    i = i + 1
                    If component(i) <> 0 Then comp = comp + 1
                Loop Until i = 255
                 
                i = 0
                 
                Do
                    Randomize Time
                    DoEvents
                    i = i + 1
                1     ' Метка для возвращения
                    a = 0
                    pass_new = ""
                    Do
                        a = a + 1
                        rnd_s = Int(Rnd * comp + 1)
                        pass_new = pass_new + Chr(component(rnd_s))
                    Loop Until a = pass_sym
                    'Сравнение паролей
                    sort = 0
                    Do
                        sort = sort + 1
                        If pass(sort) = pass_new Then GoTo 1
                    Loop Until sort = i
                    pass(i) = pass_new
                Loop Until i = pass_num + 1

              Вот весь код. Если 1000 паролей задержка незначительна, то 5000 паролей значительная. Правда еще есть вывод который тоже задерживает. Но наибольшая задержка наверное все же тут.
                Не бойся? не повторятся, если ты конечно хорошие пароли генерируешь, а не 4-х символьные )
                Ну ты и замутил )
                У тебя кругом изврат в коде. Самые сильные тормоза в месте склеивания строк:
                ExpandedWrap disabled
                  pass_new = pass_new + Chr(component(rnd_s))
                  Цитата SCINER @
                  Не бойся не повторятся, если ты конечно хорошие пароли генерируешь, а не 4-х символьные )
                  Ну ты и замутил )

                  Папроли 8-10 символов. На таких тестирую. Включены a-z/A-Z/0-9 можно менять состав, особой разницы не будет.
                  ExpandedWrap disabled
                    pass_new = pass_new + Chr(component(rnd_s))

                  А как это по другому сделать?
                  массив component содержит все включенные символы - возможно это можно как то переделать. Потому и Chr(component(rnd_s)).
                    1000 и 1 способ, хотябы так, и то лучше. Многое перекладывается на оптимизированные коды программистов M$ =)
                    ExpandedWrap disabled
                      Option Explicit
                       
                      Dim component() As Long
                       
                      Private Sub Form_Load()
                       
                        Dim i As Long
                        Dim pass As Collection
                        Dim max As Long
                        Dim B() As Byte
                        Dim j As Long
                        Dim maxlen As Long
                        Dim minLen As Long
                        Dim dwLen As Long
                        Dim Dic() As Byte
                        Dim DicCount As Long
                       
                        max = 25000
                        minLen = 8
                        maxlen = 10
                        
                        Dic = StrConv("abcdefgjiklmnopqrstuvwxyz0123456789", vbFromUnicode)
                        DicCount = UBound(Dic)
                        Set pass = New Collection
                       
                        Randomize
                       
                        For i = 0 To max - 1
                          dwLen = (maxlen - minLen) * Rnd + minLen
                          ReDim B(dwLen)
                          For j = 0 To dwLen
                            B(j) = Dic(Rnd * DicCount)
                          Next
                          If Not Add2Collection(pass, StrConv(B, vbUnicode)) Then i = i - 1
                        Next
                       
                        Me.Caption = pass(Rnd * max)
                       
                      End Sub
                       
                      Function Add2Collection(Col As Collection, ByVal szValue As String) As Boolean
                        On Error Resume Next
                        Call Err.Clear
                        Call Col.Add(szValue, "k" & szValue)
                        Add2Collection = Err.Number = 0
                      End Function
                      SCINER, спасибо, посмотрю что это такое. И адаптирую под себя.
                        Если скорость - критическое значение, то нужно подумать о форматировании списка паролей в спецаильну базу для быстрой выборки. По сути это список с хитрой структурой.
                        Где возожно использовать указатель на строку а не саму строку, что-бы избегать лишнего копирования.
                          ExpandedWrap disabled
                            For i = 1 To pass.Count
                                frmMain.txtListKey.Text = frmMain.txtListKey.Text + pass(i) + vbNewLine
                            Next

                          Вот этот цикл хоть и выводин в TextBox все эти пароли, все же не делает перевода строки. При попытке вывести pass.count все срабатвает. Он каждый раз на новой строчке выводит количество строк в коллекции pass
                          В свойствах TextBox стоит multiline=true
                          Никак не могу понять почему он не делает перенос при попытке вывести все пароли в это поле.
                          Сообщение отредактировано: Spectr-7 -
                            vbCrLf - для контролов Text только эта константа.
                            Ну и, с точки зрения быстродействия - или использовать какой-нибудь Listxx.Add(), или сначала строку сформировать отдельно, а потом вывести в Text:
                            ExpandedWrap disabled
                              S = ""
                              For i = 1 To pass.Count
                                  S = S + Pass(i) + vbCrLf
                              Next
                            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0403 ]   [ 15 queries used ]   [ Generated: 19.05.24, 16:28 GMT ]