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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2016, 21:32   #1
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию Неконтролируемое изменение переменной?

По непонятным мне причинам переменная i увеличивает свое значение на 1 в указанном куске кода. Данная переменная локальная, нигде более не используется. Возникает вопрос: "То ли я дебил, то ли лыжи не едут"? Что это за х?
Код:
procedure TfmMain.btUserReadClick(Sender: TObject);
var
  sName: string;
  i, j, x: Integer;
  sRec: TSearchRec;
  sPath: string;
  sRec_flag: boolean;
begin
  for i := 0 to List.Count - 1 do
  begin
    SG2.RowCount := SG2.RowCount + 1;
    if SG2.FixedRows = 0 then
       SG2.FixedRows := 1;
    SG2.Cells[0, 0] := '№';
    SG2.Cells[1, 0] := 'Имя';
    SG2.Cells[2, 0] := 'ключ';
    SG2.Cells[0, i + 1] := IntToStr(i + 1);
    SG2.Cells[1, i + 1] := List.Items[i].Name;
    SG2.Cells[2, i + 1] := List.Items[i].RegName;
  end;
// Тут специально для отлова глюка проверяю чему равно i и List.Count, равны они 12 и 12 соответственно
  btCloseUserTab.Caption:='i='+i.ToString+' List.Count='+(List.Count).ToString;
//---------------------------------------------------------------

    sPath := 'C:\Users\*.*';
    if FindFirst(sPath, faAnyFile, sRec) = 0 then
    begin
      repeat
        if (sRec.Attr and faDirectory) <> 0 then
        begin
          if (sRec.Name <> '.') and (sRec.Name <> '..') then
          begin
            if (sRec.Name <> 'Администратор') and (sRec.Name <> 'Все пользователи')
              and (sRec.Name <> 'Public') and (sRec.Name <> 'All Users') and
              (sRec.Name <> 'Default User') and (sRec.Name <> 'Default') then
              begin
                for j:=0 to List.Count-1 do
                begin
                  if List.Items[j].Name = sRec.Name then
                    sRec_flag:= false;
                end;
                if sRec_flag = True then
                      begin
// Тут специально  для отлова глюка проверяю чему равно i и List.Count, равны они 13 и 12 соответственно, ПОЧЕМУ???
                      fmMain.Caption:='i='+i.ToString+' List.Count='+(List.Count).ToString;
//---------------------------------------------------------------
                        SG2.RowCount := SG2.RowCount + 1;
                        inc(i);
                        SG2.Cells[0, i + 1] := IntToStr(i + 1);
                        SG2.Cells[1, i + 1] :=sRec.Name;
                        SG2.Cells[2, i + 1] := 'Нет ключа';
                      end;
                      sRec_flag:=True;
               end;
          end;
        end;
      until FindNext(sRec) <> 0;
    end;
    FindClose(sRec);
end;
Replicant вне форума Ответить с цитированием
Старый 23.10.2016, 21:49   #2
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

Код:
for i := 0 to List.Count - 1 do
Где печеньку взять?
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 23.10.2016, 21:58   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Значение переменной цикла по выходу из него вообще считается неопределенным. Низзя так использовать. Оптимизатор в отдельных случаях вообще может цикл с конца заставить отработать, хотя в цикле и нет ни какого downto. Не в этом случае естесно
Цитата:
SG2.RowCount := SG2.RowCount + 1;
Один раз нельзя что-ли перед циклом увеличить на List.Count ? И следующий if и еще три присвоения чего в цикле делают?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 23.10.2016 в 22:06.
Аватар вне форума Ответить с цитированием
Старый 23.10.2016, 22:02   #4
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Значение переменной цикла по выходу из него вообще считается неопределенным. Низзя так использовать
Хорошо, я читаю в отдельною переменную х, перед выделенным блоком значение List.Count, оно = 12 и в конце блока вместо i использую переменную х. И происходит та же фигня, х почему-то становится равным 13 (после inc(x) соответственно 14), что за бред вообще?

Цитата:
Сообщение от Аватар Посмотреть сообщение
Один раз нельзя что-ли перед циклом увеличить на List.Count ? И следующий if и еще три присвоения чего в цикле делают?
Можно. Это ясно что их из цикла выдернуть надо, но проблема-то не в этом.

Последний раз редактировалось Replicant; 23.10.2016 в 22:09.
Replicant вне форума Ответить с цитированием
Старый 23.10.2016, 22:05   #5
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Цитата:
Сообщение от BARNEY Посмотреть сообщение
Код:
for i := 0 to List.Count - 1 do
Где печеньку взять?
нигде, внимательнее код читайте

С глюком разобрался, тема закрыта.

Последний раз редактировалось Replicant; 24.10.2016 в 05:58.
Replicant вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение переменной в классе и др. Dark_zarich Общие вопросы по Java, Java SE, Kotlin 3 28.01.2012 00:17
Отследить изменение переменной _SERGEYX_ Общие вопросы Delphi 10 02.03.2011 18:59
Изменение переменной Алексей_xXx Общие вопросы C/C++ 1 11.12.2009 10:49
Изменение переменной Ant1Player PHP 8 30.03.2009 22:07
Изменение переменной yura-cat Помощь студентам 7 20.09.2008 17:42