![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка в коде. Порча данных
Eraser © (2005-08-07 19:31:00)Убил вчера весь день и сегодня 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;
Может где-то тут глупая ошибка...!
Kolan (2005-08-08 17:55:00) [1]
> Anatoly Podgoretsky © (08.08.05 16:30) [19]
Почему?
Вроде должно быть идентично
if A then
B := C;
Anatoly Podgoretsky (2005-08-08 16:30:00) [2]Lamer@fools.ua © (08.08.05 16:27) [18]
Правильно, поскольку это индетично B := C;
Lamer@fools.ua (2005-08-08 16:27:00) [3]>> Игорь Шевченко © (08.08.05 15:45) [16]
Поддерживаю. Терпеть не могу такого вида операторов:
if A then
begin
B := C;
end;
Slym (2005-08-08 15:51:00) [4]Удалено модератором
Игорь Шевченко (2005-08-08 15:45:00) [5]
> Просто прими за правило автоматически после if then сразу
> добавлять begin..end. Проще убрать их в случае необходимости,
> нежели потом выискивать ошибки.
Проще писать так, чтобы ошибок не было, а не замусоривать текст программы.
Eraser (2005-08-08 15:05:00) [6]begin...end © (08.08.05 14:51) [14]
Теперь если что, я знаю к кому обращатья надо ;-)
begin...end (2005-08-08 14:51:00) [7]> Alexander Panov
Спасибо, конечно, за рекомендацию пользоваться мной, но не в таком же количестве :-)
Alexander Panov (2005-08-08 14:50:00) [8]Удалено модератором
Alexander Panov (2005-08-08 14:49:00) [9]Удалено модератором
Alexander Panov (2005-08-08 14:48:00) [10]Удалено модератором
Alexander Panov (2005-08-08 14:48:00) [11]Удалено модератором
Eraser (2005-08-08 14:43:00) [12]Alexander Panov © (08.08.05 14:31) [7]
Да надо бы таким обзовестись. Хотя уже давольно давно не возникало таких грубых синтаксических ошибок, но видать что-то дало сбой ) что самое сторанное (для меня) что я упорно не замечал данную ошибку (
Alexander Panov (2005-08-08 14:37:00) [13]Удалено модератором
Примечание: Выключи автофлудер :-)
Alexander Panov (2005-08-08 14:31:00) [14]Просто прими за правило автоматически после if then сразу добавлять begin..end. Проще убрать их в случае необходимости, нежели потом выискивать ошибки.
Eraser (2005-08-08 14:22:00) [15]evvcom © (08.08.05 14:10) [5]
И то верно! Ничем ;-P
evvcom (2005-08-08 14:10:00) [16]
> если бы я использовал FreeAndNil
FreeAndNil чего? Локальной переменной? И чем бы тебе это помогло?
Eraser (2005-08-08 13:49:00) [17]Кстати такую ошибку было бы намного проще отловить, если бы я использовал FreeAndNil...(
Eraser (2005-08-08 13:46:00) [18]evvcom © (08.08.05 08:25) [2]
Насколько я понимаю, slClients есть сам TStringList и является списком объектов TalxNodeUID. Выражайся точнее.
Так точно.
Alexander Panov © (07.08.05 20:10) [1]
В этом куске кода Free выполняется для всех элементов slClients. Это правильно?
Нет конечно! Только вчера вечером, не за долго после того как я создал эту ветку, до меня дошло, как я лопухнулся (мягко говоря) в этом коде! Естественно надо чтобы NUID.Free; вызывался толко для элиментов, которые удаляются из списка...
А два дня насмарку из-за такой мелочи... обидно. Ошибка всегда там, где её не ждёшь, да ещё такая глупая.
evvcom (2005-08-08 08:25:00) [19]
> В этом коде: slClients - список объектов TStringList;
> NUID := TalxNodeUID(slClients.Objects[i]);
Насколько я понимаю, slClients есть сам TStringList и является списком объектов TalxNodeUID. Выражайся точнее.
Alexander Panov (2005-08-07 20:10:00) [20]Eraser © (07.08.05 19:31)
if NUID.ClientInfo.bIsLoopBack then
slClients.Delete(i);
NUID.Free;
В этом куске кода Free выполняется для всехэлементов slClients. Это правильно?