Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Warning"Переменная может быть не инициализирована", Не ожидал такого предупреждения. 
V
    Опции темы
Melancholic
Дата 4.7.2007, 06:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.5.2007

Репутация: нет
Всего: нет



Интереса ради хочу вас спросить. При компиляции приведённого ниже кода delphi 7 выдаёт предупреждение: "Переменная ObjAccount может быть не инициализирована", указывая на строчку  DoRouteQuery(self, UserAccount, since, till, ObjAccount); Прошу вас не вникая в суть кода попытаться найти путь выполнения программы, при котором эта переменная оказалась бы не инициализированной. О тчетных попытках также прошу сообщать.

Код

procedure TSLS.ProcessRouteCmd( socket: TCustomWinSocket;
                                since: TDateTime;
                                till: TDateTime;
                                objects: TStringList      );
var
  UserAccount: TUserAccount;
  ObjAccount: TObjectAccount;
  LFS: TFormatSettings;
  stream: TStringStream;
  i: integer;

begin
  //Если команда поступила от авторизованного пользователя
  if assigned(socket.data) then
  begin
    if TAccount(socket.data) is TUserAccount then
    begin
      UserAccount:= TUserAccount(socket.data);
      UserAccount.IdleTimer.Enabled:= false;
      UserAccount.IdleTimer.Enabled:= true;
      stream:= TStringStream.Create(EmptyStr);
      if objects.Count > 0 then
      begin
        for i:= 0 to objects.count-1 do
        begin
          if UserAccount.AccessRights.GetRight(objects[i]) = arClient then
          begin
            ObjAccount:= ObjectAccounts.ObjByName(objects[i]);
            if assigned(ObjAccount) then
            begin
              ObjAccount.data.active:= true;
              if ObjAccount.data.FindFirst then
              begin
                GetLocaleFormatSettings(0, LFS);
                LFS.DecimalSeparator:= '.';
                repeat
                  if (ObjAccount.data.FieldByName('Moment').AsDateTime >= since) and
                     (ObjAccount.data.FieldByName('Moment').AsDateTime <= till) then
                    stream.WriteString( GPSDataToStr( GPSData( ObjAccount.data.FieldByName('Speed').AsFloat,
                                                               ObjAccount.data.FieldByName('Moment').AsDateTime,
                                                               ObjAccount.data.FieldByName('Lattitude').AsFloat,
                                                               ObjAccount.data.FieldByName('Longtitude').AsFloat,
                                                               ObjAccount.data.FieldByName('Moment').AsDateTime,
                                                               ObjAccount.data.FieldByName('Engine').AsBoolean    ) ) );
                until not ObjAccount.data.FindNext;
                stream.WriteString(GPSStartCmd + strCEndOfListCmd + GPSEOC);
              end else
                raise ESLS.create(emNotData, ecCNotData);
            end else
              raise ESLS.create(emObjectNotFound, ecCObjectNotFound);
          end else
            raise ESLS.create(emAccessNotDefined, ecCAccessNotDefined);
        end;//for
        stream.Position:= 0;
        socket.SendStream(stream);
        DoRouteQuery(self, UserAccount, since, till, ObjAccount);
      end;//if
    end else
      raise ESLS.create(emAccessNotDefined, ecCAccessNotDefined);
  end else
    raise ESLS.create(emAccessNotDefined, ecCAccessNotDefined);
end;

PM MAIL   Вверх
Rodman
Дата 4.7.2007, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



во первый отредактируй код твои ESLE  меня вооще пугают...

но твою ошибку я так и не увидел.. попробуй имя другое придумать, наверно повторяется!
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Alexeis
Дата 4.7.2007, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Все правильно говорит.  Строчка ObjAccount:= ObjectAccounts.ObjByName(objects[i]); находиться на более глубоком уровне вложенности ифов чем строчка DoRouteQuery(self, UserAccount, since, till, ObjAccount); где он используется. Это значит что в случае если if не сработает значит переменная будет использоваться неинициализированной. Если такой вариант исключен по логике работы, то советую вставить строчку ObjAccount:=nil; после строчки  
Код

if objects.Count > 0 then
      begin



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Melancholic
Дата 4.7.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.5.2007

Репутация: нет
Всего: нет



Цитата

во первый отредактируй код твои ESLE  меня вооще пугают...

У меня на всё всегда есть железный отмаз: "Это демо-версия" smile
А вообще это у меня раньше стиль такой был. Сейчас ушел от этого. Поправлю.
Цитата

попробуй имя другое придумать, наверно повторяется!

Если даже и повторяется, то оно перекрывается тем именем, что объявлено в разделе переменных нашей процедуры и конфликтов не должно быть.

Цитата

Все правильно говорит.  Строчка ObjAccount:= ObjectAccounts.ObjByName(objects[i]); находиться на более глубоком уровне вложенности ифов чем строчка DoRouteQuery(self, UserAccount, since, till, ObjAccount); где он используется. Это значит что в случае если if не сработает значит переменная будет использоваться неинициализированной. Если такой вариант исключен по логике работы, то советую вставить строчку ObjAccount:=nil; после строчки  

Дело в том, что если какой-то if не сработает, то будет сгенерировано исключение и программа просто не дойдёт до строчки DoRouteQuery(self, UserAccount, since, till, ObjAccount);
PM MAIL   Вверх
Alexeis
Дата 4.7.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Melancholic @  4.7.2007,  10:36 Найти цитируемый пост)
Дело в том, что если какой-то if не сработает, то будет сгенерировано исключение и программа просто не дойдёт до строчки DoRouteQuery(self, UserAccount, since, till, ObjAccount); 

  Значит нужно просто занулить ObjAccount, чтобы успокоить компилятор.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Melancholic
Дата 4.7.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.5.2007

Репутация: нет
Всего: нет



Спасибо за помощь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.