Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
ВнизОшибка в коде. Порча данных Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.042 c