Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.28;
Скачать: CL | DM;

Вниз

Ошибка в коде. Порча данных   Найти похожие ветки 

 
Eraser ©   (2005-08-07 19:31) [0]

Убил вчера весь день и сегодня 8 часов на поиск бага в программе. Облазел буквально весь код... оказалось что ошибка здесь:

procedure TfmMain.clDeleteSelfClients;
var
 i: integer;
 NUID: TalxNodeUID;
begin
 try
   for i := slClients.Count - 1 downto 0 do
   begin
     NUID := TalxNodeUID(slClients.Objects[i]);
     if NUID = nil then
       Continue;
     if NUID.ClientInfo.bIsLoopBack then
       slClients.Delete(i);
     NUID.Free;
   end;
 except
 end;
end;


В этом коде: slClients - список объектов TStringList; TalxNodeUID - класс, наследник TObject, содержащий структуру (запись) ClientInfo, в которой все элименты строго определённого размера, как и положено... так же структура объявлена с ключевым словом packed.
Так вот после выполнения ЭТОГО кода, портятся все данные в структурах ClientInfo ВСЕХ элиментов списка slClients. При этом указатели на NUID работают.
Не пойму, где тут ошибка... может меня уже глючит )

Обявление класса TalxNodeUID:
 TalxNodeUID = class(TObject)
 public
   UID: string;
   ClientInfo: TalxClientInfo;
   ChannelList: TStringList;
   crPublicKey: TMemoryStream; // НЕ ЗАДЕЙСТВОВАН
   crPrivateKey: TMemoryStream; // НЕ ЗАДЕЙСТВОВАН
   sPassword: string; // НЕ ЗАДЕЙСТВОВАН
   constructor Create(AClientInfo: TalxClientInfo);
   destructor Destroy; override;
 end;

constructor TalxNodeUID.Create(AClientInfo: TalxClientInfo);
begin
 inherited Create;
 UID := AClientInfo.sClientUID;
 ChannelList := TStringList.Create;
 //crPublicKey := TMemoryStream.Create;
 //crPrivateKey := TMemoryStream.Create;
 ClientInfo := AClientInfo;
end;

destructor TalxNodeUID.Destroy;
begin
 ChannelList.Free;
 //crPublicKey.Free;
 //crPrivateKey.Free;
 inherited Destroy;
end;


Может где-то тут глупая ошибка...!


 
Alexander Panov ©   (2005-08-07 20:10) [1]

Eraser ©   (07.08.05 19:31)

    if NUID.ClientInfo.bIsLoopBack then
      slClients.Delete(i);
    NUID.Free;


В этом куске кода Free выполняется для всех элементов slClients. Это правильно?


 
evvcom ©   (2005-08-08 08:25) [2]


> В этом коде: slClients - список объектов TStringList;
> NUID := TalxNodeUID(slClients.Objects[i]);

Насколько я понимаю, slClients есть сам TStringList и является списком объектов TalxNodeUID. Выражайся точнее.


 
Eraser ©   (2005-08-08 13:46) [3]

evvcom ©   (08.08.05 08:25) [2]
Насколько я понимаю, slClients есть сам TStringList и является списком объектов TalxNodeUID. Выражайся точнее.


Так точно.

Alexander Panov ©   (07.08.05 20:10) [1]
В этом куске кода Free выполняется для всех элементов slClients. Это правильно?


Нет конечно! Только вчера вечером, не за долго после того как я создал эту ветку, до меня дошло, как я лопухнулся (мягко говоря) в этом коде! Естественно надо чтобы NUID.Free; вызывался толко для элиментов, которые удаляются из списка...
А два дня насмарку из-за такой мелочи... обидно. Ошибка всегда там, где её не ждёшь, да ещё такая глупая.


 
Eraser ©   (2005-08-08 13:49) [4]

Кстати такую ошибку было бы намного проще отловить, если бы я использовал FreeAndNil...(


 
evvcom ©   (2005-08-08 14:10) [5]


> если бы я использовал FreeAndNil

FreeAndNil чего? Локальной переменной? И чем бы тебе это помогло?


 
Eraser ©   (2005-08-08 14:22) [6]

evvcom ©   (08.08.05 14:10) [5]

И то верно! Ничем ;-P


 
Alexander Panov ©   (2005-08-08 14:31) [7]

Просто прими за правило автоматически после if then сразу добавлять begin..end. Проще убрать их в случае необходимости, нежели потом выискивать ошибки.


 
Alexander Panov ©   (2005-08-08 14:37) [8]

Удалено модератором
Примечание: Выключи автофлудер :-)


 
Eraser ©   (2005-08-08 14:43) [9]

Alexander Panov ©   (08.08.05 14:31) [7]

Да надо бы таким обзовестись. Хотя уже давольно давно не возникало таких грубых синтаксических ошибок, но видать что-то дало сбой ) что самое сторанное (для меня) что я упорно не замечал данную ошибку (


 
Alexander Panov ©   (2005-08-08 14:48) [10]

Удалено модератором


 
Alexander Panov ©   (2005-08-08 14:48) [11]

Удалено модератором


 
Alexander Panov ©   (2005-08-08 14:49) [12]

Удалено модератором


 
Alexander Panov ©   (2005-08-08 14:50) [13]

Удалено модератором


 
begin...end ©   (2005-08-08 14:51) [14]

> Alexander Panov

Спасибо, конечно, за рекомендацию пользоваться мной, но не в таком же количестве :-)


 
Eraser ©   (2005-08-08 15:05) [15]

begin...end ©   (08.08.05 14:51) [14]

Теперь если что, я знаю к кому обращатья надо ;-)


 
Игорь Шевченко ©   (2005-08-08 15:45) [16]


> Просто прими за правило автоматически после if then сразу
> добавлять begin..end. Проще убрать их в случае необходимости,
> нежели потом выискивать ошибки.


Проще писать так, чтобы ошибок не было, а не замусоривать текст программы.


 
Slym ©   (2005-08-08 15:51) [17]

Удалено модератором


 
Lamer@fools.ua ©   (2005-08-08 16:27) [18]

>>Игорь Шевченко ©   (08.08.05 15:45) [16]

Поддерживаю. Терпеть не могу такого вида операторов:

if A then
begin
 B := C;
end;


 
Anatoly Podgoretsky ©   (2005-08-08 16:30) [19]

Lamer@fools.ua ©   (08.08.05 16:27) [18]
Правильно, поскольку это индетично B := C;


 
Kolan ©   (2005-08-08 17:55) [20]


> Anatoly Podgoretsky ©   (08.08.05 16:30) [19]

Почему?
Вроде должно быть идентично
if A then
 B := C;



Страницы: 1 вся ветка

Текущий архив: 2005.08.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
14-1122917306
Starcom
2005-08-01 21:28
2005.08.28
Своя прога для обновления прошивки CD/DVD-R/RW?


14-1123211394
Gydvin
2005-08-05 07:09
2005.08.28
Конференция "Начинающим"


14-1123228858
boriskb
2005-08-05 12:00
2005.08.28
С кем бы вы хотели поговорить?


14-1122964668
dmitry99
2005-08-02 10:37
2005.08.28
День Десантника.


14-1123486805
AndrewK
2005-08-08 11:40
2005.08.28
Посоветуйте готовое решение