Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2011, 11:35   #1
ProESM
Пользователь
 
Регистрация: 09.11.2008
Сообщений: 27
По умолчанию Проблема с циклом 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" никакой другой переменной нет. Поясните, пожалуйста
ProESM вне форума Ответить с цитированием
Старый 11.05.2011, 11:52   #2
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Это работа оптимизатора.
Можете его отключить. Поставьте перед циклом: {$O-}
Включить: {$O+}
_Dmitry вне форума Ответить с цитированием
Старый 11.05.2011, 12:37   #3
ProESM
Пользователь
 
Регистрация: 09.11.2008
Сообщений: 27
По умолчанию

Цитата:
Сообщение от _Dmitry Посмотреть сообщение
Это работа оптимизатора.
Можете его отключить. Поставьте перед циклом: {$O-}
Включить: {$O+}
Не помогло
ProESM вне форума Ответить с цитированием
Старый 11.05.2011, 12:46   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

а если так сделать?
Код:
   // Получаем префикс времени
    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
      i:=0;
      while i<= High(del) do begin
        a[i] := N div del[i];
        N := N mod del[i];
        inc(i);
      end;

      Result := '';
      for I := 0 to High(del) do
        if a[i] <> 0 then
          Result := Result + IntToStr(a[i]) + pref[i];
    end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.05.2011, 12:50   #5
ProESM
Пользователь
 
Регистрация: 09.11.2008
Сообщений: 27
По умолчанию

Естественно, что так все работает. Я аналогично поступал, и через repeat пробовал. А вот через for не получилось ((
Хм... Но это все равно значит уйти от проблемы и решить задачу, а не решить и задачу и проблему
ProESM вне форума Ответить с цитированием
Старый 11.05.2011, 13:32   #6
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Почему не помогло?
У меня работает.
Главное не включать оптимизатор снова.
Код:
    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;
      {$O-}
      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;
Можно его выключить и здесь: Project->Options...->Compiler->Optimization (это для Delphi 7)

Последний раз редактировалось _Dmitry; 11.05.2011 в 13:34.
_Dmitry вне форума Ответить с цитированием
Старый 11.05.2011, 13:35   #7
YarUnderoaker
Пользователь
 
Регистрация: 30.03.2010
Сообщений: 11
По умолчанию

Как работает for .. to .. do - это одно из первых, что надо знать Делфи-програмисту
Цитата:
Warning: The iteration variable counter cannot be modified within the loop. This includes assignment and passing the variable to a var parameter of a procedure. Doing so results in a compile-time warning.
http://docwiki.embarcadero.com/RADSt...For_Statements
YarUnderoaker вне форума Ответить с цитированием
Старый 11.05.2011, 14:01   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Но это все равно значит уйти от проблемы и решить задачу, а не решить и задачу и проблему

а в чём проблема, собственно?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 11.05.2011, 14:11   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

ну так алгоритм же надо правильно писать. Тогда не будет и проблем!
В Вашем случае всё работает. только секунды в выходную выборку не попадают (a[i] - а i никогда не станет равным 6)

вот, попробуйте такой код:
Код:
    // Получаем префикс времени
    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 := '';

      for i := 0 to 6 do
      begin
        a[i] := N div del[i];
        N := N mod del[i];
        if a[i] <> 0 then
          Result := Result + IntToStr(a[i]) + pref[i]
      end
    end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.05.2011, 14:40   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

http://forum.sources.ru/index.php?sh...post&p=2892243
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с циклом! Ислам Помощь студентам 2 21.03.2011 00:48
Проблема с циклом DsDevis Паскаль, Turbo Pascal, PascalABC.NET 8 24.01.2011 00:01
проблема с циклом kiborgdelto Помощь студентам 1 16.10.2010 19:46
проблема с циклом Dima_D Общие вопросы Delphi 5 04.08.2010 16:41
Проблема с циклом.. POPOV Помощь студентам 3 29.04.2008 18:36