|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Проблема с циклом 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 Код:
for i := 0 to N do В чем причина?! Более в коде под "i" никакой другой переменной нет. Поясните, пожалуйста |
#2
|
||||
|
||||
А зачем тебе это?
Компилятор оптимизирующий, он понимает что убывающий цикл преобразуется в более эфективный машинный код чем возрастающий. Результат-то у тебя верный, чего тебе еще нужно? Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
|||
|
|||
Цитата:
Проблема как раз в том, что мне необходима моя реализация алгоритма, так как от направления зависит результат вычислений. Не вдаваясь в подробности алгоритма, вопрос адресован конкретно по этому на мой взгляд необъяснимому и непонятному поведению компилятора. Насчет преобразования хотелось бы поподробней, ибо он такое не всегда совершает. К примеру, в конструкции: Код:
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
|
||||
|
||||
Если я написал что результат верный - значит я проверил. От направления, кста, результат вычислений не зависит.
Отключи оптимизацию - будет по порядку. Но это не верный путь. Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#5
|
|||
|
|||
Цитата:
Спорить не буду. Отключил - не помогло |
#6
|
|||
|
|||
Используй указатели.
Код:
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
|
||||
|
||||
Эх, откуда ж вы такие беретесь-то, неверующие.
РАЗ: Выдержка из хелпа: Цитата:
Код скопипастил из вашего поста, ничего не менял только добавил вызов. ДВА: Проход со включенной оптимизацией - ТРИ: Проход с отключенной оптимизацией - Если у вас не изменилось - обновите драйвер hands.sys Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |