Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.05.2011, 11:37
ProESM ProESM вне форума
Прохожий
 
Регистрация: 19.03.2009
Сообщения: 33
Репутация: 10
По умолчанию Проблема с циклом for

Приветствую всех.

Перейду сразу к делу.
Код:
    // Получаем префикс времени
    function GetTimePrefix(N: Integer): String;
    const
      pref: array [0..6] of string = (' г. ', ' м. ', ' н. ', ' д. ', ' ч. ', ' мин. ', ' сек. ');
      del: array [0..6] of Integer = (31536000, 2592000, 604800, 86400, 3600, 60, 1);
    var
      a: array [0..6] of Integer;
      i: integer;
    begin
      Result := '';
      a[6] := N;
     
      for i := 0 to 5 do
      begin
        a[i] := a[6] div del[i];
        a[6] := a[6] mod del[i];
        if a[i] <> 0 then
          Result := Result + IntToStr(a[i]) + pref[i]
      end
    end;

После строки
Код:
for i := 0 to 5 do
счетчик при первой итерации устанавливается в i=6, а затем спускается вниз. Замечено, что если поставить
Код:
for i := 0 to N do
то счетчик примет при первой итерации значение i=N+1.

В чем причина?! Более в коде под "i" никакой другой переменной нет. Поясните, пожалуйста
Ответить с цитированием
  #2  
Старый 11.05.2011, 11:46
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А зачем тебе это?
Компилятор оптимизирующий, он понимает что убывающий цикл преобразуется в более эфективный машинный код чем возрастающий. Результат-то у тебя верный, чего тебе еще нужно?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 11.05.2011, 12:32
ProESM ProESM вне форума
Прохожий
 
Регистрация: 19.03.2009
Сообщения: 33
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
А зачем тебе это?
Компилятор оптимизирующий, он понимает что убывающий цикл преобразуется в более эффективный машинный код чем возрастающий. Результат-то у тебя верный, чего тебе еще нужно?

Проблема как раз в том, что мне необходима моя реализация алгоритма, так как от направления зависит результат вычислений.

Не вдаваясь в подробности алгоритма, вопрос адресован конкретно по этому на мой взгляд необъяснимому и непонятному поведению компилятора.

Насчет преобразования хотелось бы поподробней, ибо он такое не всегда совершает. К примеру, в конструкции:
Код:
for i := 0 to FileList.Count - 1 do
  begin
    FileNameLabel.Caption := 'Файл: ' + FileList.Strings[i];
    DetalProgressBar.Position := 0;
    DetalProgressBar.Hint := ExtractFileName(FileList.Strings[i]);
    ByteS := 0;
    TimeBuf := Now();
    Windows.CopyFileEx(
      PChar(UpdatePath+FileList.Strings[i]),
      PChar(AppPath+FileList.Strings[i]),
      @ProgressRoutine,
      nil,
      nil,
      0
    );
    if IsCanceled then Break;
  end;
все работает так, как нужно, без полтергейстов.
Ответить с цитированием
  #4  
Старый 11.05.2011, 12:39
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Если я написал что результат верный - значит я проверил. От направления, кста, результат вычислений не зависит.
Отключи оптимизацию - будет по порядку. Но это не верный путь.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #5  
Старый 11.05.2011, 13:13
ProESM ProESM вне форума
Прохожий
 
Регистрация: 19.03.2009
Сообщения: 33
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Если я написал что результат верный - значит я проверил. От направления, кста, результат вычислений не зависит.
Отключи оптимизацию - будет по порядку. Но это не верный путь.

Спорить не буду. Отключил - не помогло
Ответить с цитированием
  #6  
Старый 11.05.2011, 13:36
flexterful flexterful вне форума
Прохожий
 
Регистрация: 24.03.2011
Сообщения: 9
Репутация: 10
По умолчанию

Используй указатели.

Код:
 PSomeItem = ^TSomeItem;
 TSomeItem = class
  Data : TSomeData;
  Next : PSomeItem;
 end;

Итерация

Код:
var
 Elem : PSomeItem;
begin
 Elem := FirstSomeItem;
 while Elem <> nil do
  begin
   // blah blah
   Elem := Elem.Next;
  end;
Ответить с цитированием
  #7  
Старый 11.05.2011, 13:42
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Эх, откуда ж вы такие беретесь-то, неверующие.
РАЗ: Выдержка из хелпа:
Цитата:
Other than for certain debugging situations, you should never have a need to turn optimizations off. All optimizations performed by the Delphi compiler are guaranteed not to alter the meaning of a program. In other words, the compiler performs no "unsafe" optimizations that require special awareness by the programmer.

Note: Note: The $O directive can only turn optimization on or off for an entire procedure or function. You can't turn optimization on or off for a single line or group of lines within a routine.
Главную мысль я подчеркнул.

Код скопипастил из вашего поста, ничего не менял только добавил вызов.
ДВА:
Проход со включенной оптимизацией -

ТРИ:
Проход с отключенной оптимизацией -

Если у вас не изменилось - обновите драйвер hands.sys
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:02.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter