На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Проблема с циклом for... , ... по непонятной причине считает с конца
    Столкнулся тут со странной проблемой. Весь код обыскал - ну всё, казалось бы, правильно. Методом научного тыка выяснил, что проблема кроется в коде:

    ExpandedWrap disabled
        for n := 0 to LoginCount.Count-1 do
        begin
          for m := 0 to PassCount.Count-1 do
          begin
            Login := LoginCount.Strings[n];
            Password := PassCount.Strings[m];
            POST;
          end;
        end;


    При первом же запуске и значение "m", и значение "n" принимают свои максимальные значения. А должны принимать значение "0". Я пол дня ломал над этим голову. Поискал по Интернету - оказывается я не один такой. У некоторых тоже встречается эта проблема. Решают её либо переписыванием неугодного кода, либо отключением оптимизации в свойствах компилятора. Отключал - не помогает.

    Кто-нибудь может объяснить, почему так происходит и как мне это победить?
      Цитата Navern @
      При первом же запуске и значение "m", и значение "n" принимают свои максимальные значения

      Отладчиком прошелся? В какой точке смотришь значения переменных? В теле цикла(ов)?
        В настройках компилятора отключи оптимизацию. Это именно она пускает циклы с конца.
          Оптимизация в Делфях не доведена до ума, даже если отключить оптимизацию, то компилятор все равно кое-что оптимизирует :wacko:
            Testudo, оптимизацию отключал, я писал об этом. Не помогло... Альтернативы отключению оптимизации есть?
              циклы while сделай, да и всё.
                Цитата Navern @
                Альтернативы отключению оптимизации есть?

                замени for на While
                  Цитата Navern @
                  При первом же запуске и значение "m", и значение "n" принимают свои максимальные значения


                  ExpandedWrap disabled
                    var
                      LoginCount, PassCount: TStrings;
                      n, m: Integer;
                      Login, PAssword: string;
                    begin
                      PassCount := nil;
                      LoginCount :=TStringList.Create;
                      try
                        PassCount := TStringList.Create;
                        for n := 0 to 10 - 1 do
                        begin
                          PassCount.Add(IntToStr(n));
                          LoginCount.Add(IntToStr(n));
                        end;
                     
                        for n := 0 to LoginCount.Count-1 do
                        begin
                          for m := 0 to PassCount.Count-1 do
                          begin
                            ShowMessage(Format('n = %d, m = %d', [n, m]));
                            Login := LoginCount.Strings[n];
                            Password := PassCount.Strings[m];
                    //        POST;
                          end;
                        end;
                      finally
                        PassCount.Free; LoginCount.Free;
                      end;
                    end;

                  Первое сообщение соджержит текст:

                  ---------------------------
                  Project7
                  ---------------------------
                  n = 0, m = 0
                  ---------------------------
                  OK
                  ---------------------------

                  Что я делаю не так?
                    Цитата jack128 @
                    Что я делаю не так?

                    Вот это:
                    Цитата jack128 @
                    ExpandedWrap disabled
                              ShowMessage(Format('n = %d, m = %d', [n, m]));
                      Domino
                      а чем это не правельно?
                        Компилятор выполняет подобную оптимизацию, когда результат выполнения не зависит от направления цикла.
                        ExpandedWrap disabled
                          for I := 0 to 10 do
                            Result := Result + Values[I];
                        будет скомпилировано как
                        ExpandedWrap disabled
                          for I := 10 downto 0 do
                            Result := Result + Values[I];
                        ,но
                        ExpandedWrap disabled
                          for I := 0 to 10 do
                          begin
                            ShowMessage(Format('Добавляем %d...', [I]))
                            Result := Result + Values[I];
                          end;
                        будет выполняться именно в заданном разработчиком порядке.

                        Navern, в большинстве случаев такая "оригинальная" оптимизация компилятора не мешает, но в твоем случае, если тебе важен порядок взлома чего-то там, измени логику метода.
                          Domino, ладно, спасибо. Попробую переписать по-другому.
                          Сообщение отредактировано: Navern -
                            Цитата Domino @
                            for I := 0 to 10 do
                            Result := Result + Values[I];

                            будет скомпилировано как
                            for I := 10 downto 0 do
                            Result := Result + Values[I];


                            Да ? Не уж то компилятор обладает навыками телепатии?? Хотелось бы конечно, но маловероятно.

                            Нажми Alt + Ctrl + C и посмотри сам во что компилируется твой код.
                              Цитата jack128 @
                              Не уж то компилятор обладает навыками телепатии?

                              Случается.
                              Цитата jack128 @
                              Нажми Alt + Ctrl + C и посмотри сам во что компилируется твой код.

                              Хм, и вправду. Запостил не проверив. Но это точно есть! Позже, если я найду у себя код, где это проявлялось, то выложу. А вот здесь точно цикл переворачивается (и не только переворачивается):
                              ExpandedWrap disabled
                                  for I := 5 to 9 do
                                    S := S + 1;
                                Цитата Domino @
                                А вот здесь точно цикл переворачивается (и не только переворачивается):

                                здесь - да, переворачивается. Но в этом цикле ты счетчик цикла ВООБЩЕ не используешь. А в #1 - счетчик используется - поэтому разворота цикла быть не может.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


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