Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
8-1113722486
X-Disa
2005-04-17 11:21
2005.08.28
32-битные bmp в меню и кнопках


1-1123404272
Ксардас
2005-08-07 12:44
2005.08.28
Как получить номер верхней видной строки в РичЭдите?


14-1123163253
TUser
2005-08-04 17:47
2005.08.28
Браток


1-1123484706
Новичёк
2005-08-08 11:05
2005.08.28
DLL и его процедуры и функции


14-1123147824
3DxFantastika
2005-08-04 13:30
2005.08.28
Как перевести дату в UNIX-время (формат)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский