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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2011, 16:02   #1
IDARKShadowI
 
Регистрация: 10.10.2011
Сообщений: 4
Печаль Delphi XE, не работают циклы

Добрый день!

Использую в работе Delphi XE, всё хорошо и вот недавно возникла проблема перестали работать некоторые циклы. Проект большой, суть его в том имеется таблица значений, столбцов порядка 30, а строк может быть много, от единиц до десятков и сотен тысяч. Строки обрабатываются в циклах и вот некоторые из этих циклов, при количестве итераций больше 32597 строк, перестали работать, то есть программа их просто проскакивает, при этом никаких условий перед циклом нет. Так-же заметил что в некоторых случаях такое возникало когда цикл был не от 0, но тем не менее первое значение цикла было меньше конечного:

Код:
procedure SomeProc(FirstRow, LastRow: integer);{FirstRow заведомо меньше LastRow}
var
  i: integer;
begin
  {Некоторые начальные операции, которых может и не быть} 
  for i := FirstRow to LastRow do 
  begin 
    {операции со строкой i} 
  end; 
end;
Временное решение было таким:

Код:
procedure SomeProc(FirstRow, LastRow: integer);{FirstRow заведомо меньше LastRow} 
var 
  i, j: integer; 
begin 
  {Некоторые начальные операции, которых может и не быть} 
  for j := 0 to (LastRow - FirstRow) do 
  begin 
    i := FirstRow + j; 
    {операции со строкой i} 
  end; 
end;
В итоге цикл работает при количестве итерации большем 32597. Но был и случай когда цикл уже был от 0:

Код:
procedure SomeProc;{FirstRow заведомо меньше LastRow} 
var 
  i: integer; 
begin 
  {Некоторые начальные операции, которых может и не быть} 
  for i := 0 to RowCount - 1 do 
  begin 
    {операции со строкой i} 
  end; 
end;
В этом случае, сделал так:

Код:
procedure SomeProc;{FirstRow заведомо меньше LastRow} 
var 
  i, j: integer; 
begin 
  {Некоторые начальные операции, которых может и не быть} 
  for j := 0 to RowCount - 1 do 
  begin 
    i := j; 
    {операции со строкой i} 
  end; 
end;
И цикл начал работать.
При замене цикла на цикл while всё работает.
Оптимизация отключена глобально.

В чём тут может быть проблема?
IDARKShadowI вне форума Ответить с цитированием
Старый 11.10.2011, 12:25   #2
IDARKShadowI
 
Регистрация: 10.10.2011
Сообщений: 4
По умолчанию

Воспроизвел ошибку на тестовом проекте, вынес в класс:

Код:
TError = class
private
  function Add(FromV, ToV: Integer): Integer;
  function Check(Row: Integer; Val: Byte): Boolean;
  function Operation(Index: Integer; Func: TFunc<Integer,Integer>): Integer;
public
  function Run(Count: Integer): Integer;
end;

function TError.Add(FromV, ToV: Integer): Integer;
var
  i: Integer;
  res: Integer;
  func: TFunc<Integer,Integer>;
begin
  res := 0;
  func :=
    function(data: Integer): Integer
    begin
      if Check(i, MAXBYTE div 2) then
        Result := data;
    end;

  for i := FromV to ToV do
    res := Operation(i, func);

  Result := res;
end;

function TError.Check(Row: Integer; Val: Byte): Boolean;
begin
  Result := True;
end;

function TError.Operation(Index: Integer; Func: TFunc<Integer, Integer>): Integer;
begin
  if Assigned(Func) then
    Result := Func(Index);
end;

function TError.Run(Count: Integer): Integer;
begin
  Result := Add(0, Count);
end;
В результате получаем, если:
  • Count < 32767, то Run < 32767
  • Count = 32767, то программа зависает (видимо цикл бесконечный получается)
  • Count > 32767, то Run = 0 (цикл внутри не выполняется ни разу)

Если реализацию анонимного метода вынести в отдельный метод, тогда всё работает как надо. Если условие Check сделать без параметров, тогда будет всё работать и с анонимным методом.

Либо я что-то делаю не так, либо это баг в Delphi XE, если это так, то стоит ли отправлять это на сайт Эмбаркадеро?
IDARKShadowI вне форума Ответить с цитированием
Старый 11.10.2011, 13:36   #3
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

чему равно MAXBYTE div 2?
Может дело тут?
32768 это диапазон 0 - 32767 (signed integer 2-х байтный)
psycho-coder вне форума Ответить с цитированием
Старый 11.10.2011, 14:42   #4
IDARKShadowI
 
Регистрация: 10.10.2011
Сообщений: 4
По умолчанию

Не думаю, так как метод Check возвращает всегда истину, и от параметров не зависит.
IDARKShadowI вне форума Ответить с цитированием
Старый 11.10.2011, 16:29   #5
IDARKShadowI
 
Регистрация: 10.10.2011
Сообщений: 4
По умолчанию

Запостил отчёт:

http://qc.embarcadero.com/wc/qcmain.aspx?d=99909

Проголосуйте, если есть возможность.
IDARKShadowI вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работают формулы в Excel при заполнении данных из Delphi ZHDN Общие вопросы Delphi 1 30.07.2011 13:17
Delphi, циклы Coyot Помощь студентам 1 11.10.2010 15:41
генератор поля, не работают триггеры delphi Domanoff БД в Delphi 4 07.04.2010 21:40
Delphi 7. Циклы Юрий2009 Помощь студентам 2 01.05.2009 12:01
Delphi 7. Циклы Юрий2009 Помощь студентам 0 27.04.2009 19:43