Текущий архив: 2010.08.27;
Скачать: CL | DM;
ВнизНе уничтожается класс с 0 индексом Найти похожие ветки
← →
Алексей2010 (2010-02-06 19:56) [0]Вываливается ошибка при попытки освободить экземплары класса Class2 и Class3 с индексом 0. Подскажите что я делаю неправильно?
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TClass3 = class
private
FParam3 : string;
public
property Param3 : string read FParam3 write FParam3;
constructor Create;
destructor Destroy;
end;
TClass2 = class
private
FParam2 : string;
FSize3 : word;
FClass3 : array of TClass3;
procedure SetClass3 (Index : word; AClass3 : TClass3);
function GetClass3 (Index: word) : TClass3;
procedure SetSize3 (ASize3 : word);
public
property Param2 : string read FParam2 write FParam2;
property Class3 [Index : word] : TClass3 read GetClass3 write SetClass3;
property Size3 : word read FSize3 write SetSize3;
constructor Create;
destructor Destroy;
end;
TClass1 = class
private
FSize2 : word;
FClass2 : array of TClass2;
procedure SetClass2 (Index : word; AClass2 : TClass2);
function GetClass2 (Index: word) : TClass2;
procedure SetSize2 (ASize2 : word);
public
property Class2 [Index : word] : TClass2 read GetClass2 write SetClass2;
property Size2 : word read FSize2 write SetSize2;
constructor Create;
destructor Destroy;
end;
implementation
////////////////////////////////////////////////////////
//TClass1
////////////////////////////////////////////////////////
procedure TClass1.SetClass2 (Index : word; AClass2 : TClass2);
begin
FClass2 [Index] := AClass2;
end;
//-----------------------------------------------------
function TClass1.GetClass2 (Index: word) : TClass2;
begin
Result := FClass2 [Index];
end;
//-----------------------------------------------------
procedure TClass1.SetSize2 (ASize2 : word);
var
I : word;
begin
if FSize2 <> 0 then // åñëè íå ïåðâûé âûçîâ
for I := 0 to Size2 do // îñâîáîæäàåì ïàìÿòü
FreeAndNil (FClass2 [I]); // ERROR EROOR ÎØÈÁÊÀ, íå îñâîáîæäàåòñÿ îáúåêò ñ èíäåêñîì 0
// ñîçäàåì ìàññèâ è îáúåêòû Class2
FSize2 := ASize2;
SetLength (FClass2, Size2);
for I := 0 to Size2 do
FClass2 [I] := TClass2.Create;
end;
//-----------------------------------------------------
constructor TClass1.Create;
begin
end;
//-----------------------------------------------------
destructor TClass1.Destroy;
var
I : word;
begin
for I := 0 to Size2 do
FreeAndNil (FClass2 [I]);
end;
////////////////////////////////////////////////////////
//TC2
////////////////////////////////////////////////////////
procedure TClass2.SetClass3 (Index : word; AClass3 : TClass3);
begin
FClass3 [Index] := AClass3;
end;
//-----------------------------------------------------
function TClass2.GetClass3 (Index: word) : TClass3;
begin
Result := FClass3 [Index];
end;
//-----------------------------------------------------
procedure TClass2.SetSize3 (ASize3 : word);
var
I : word;
begin
if FSize3 <> 0 then // åñëè íå ïåðâûé âûçîâ
for I := 0 to Size3 do // îñâîáîæäàåì ïàìÿòü
FreeAndNil (FClass3 [I]); // ERROR EROOR ÎØÈÁÊÀ, íå îñâîáîæäàåòñÿ îáúåêò ñ èíäåêñîì 0
// ñîçäàåì ìàññèâ è îáúåêòû Class2
FSize3 := ASize3;
SetLength (FClass3, Size3);
for I := 0 to Size3 do
FClass3 [I] := TClass3.Create;
end;
//-----------------------------------------------------
constructor TClass2.Create;
begin
end;
//-----------------------------------------------------
destructor TClass2.Destroy;
begin
end;
////////////////////////////////////////////////////////
//TC3
////////////////////////////////////////////////////////
constructor TClass3.Create;
begin
end;
//-----------------------------------------------------
destructor TClass3.Destroy;
begin
end;
← →
oldman © (2010-02-06 20:03) [1]Кажется ты вываливаешься за границы массива.
Если FSize равно, предположим, шести, у тебя в массиве шесть элементов?
А For i: to FSize подразумевает 7.
← →
oldman © (2010-02-06 20:07) [2]И что-то у меня сомнения насчет FretAndNil массива поэлементно с головы...
← →
KilkennyCat © (2010-02-06 21:23) [3]
> oldman © (06.02.10 20:07) [2]
он же не элементы массива грохает, а содержимое, так что без разницы откуда.
← →
Anatoly Podgoretsky © (2010-02-06 22:50) [4]downto
А что за бардак с пустыми Create и Destroy
← →
Демо © (2010-02-06 23:46) [5]
> Алексей2010 (06.02.10 19:56)
А где пример использования?
← →
Игорь Шевченко © (2010-02-06 23:47) [6]
> Подскажите что я делаю неправильно?
Все.
По пунктам:
не говоришь, что за ошибка.
вываливаешь огромный код с комментариями на непонятном языке
просишь незнакомых людей поработать визуальными отладчиками
читай и воздастся тебе:
http://ln.com.ua/~openxs/articles/smart-questions-ru.html
← →
Алексей2010 (2010-02-07 10:01) [7]Удалено модератором
← →
oldman © (2010-02-07 10:24) [8]Из текста программы неясно, что хранится в переменных Size2, Size3 и Index при вызове функций.
А вот это:
> procedure TClass1.SetClass2 (Index : word; AClass2 : TClass2);
> begin
> FClass2 [Index] := AClass2;
> end;
Зачем было оформлять процедурой?
Посылать два параметра, чтоб один присвоить другому...
← →
sniknik © (2010-02-07 10:29) [9]> а нафига тогда вообще эта конференция?
ну явно не для дебага дурного кода... или отгадывания места ошибки и что за ошибка...
одна из целей в наставлении начинающих... на то чтоб им начать думать самим, на то чтоб обдумывать вопрос, а не просто "бухать как есть, не пойми что, и ждать конкретного ответа" (это фантастика сынок...), но то чтобы вопрос действительно был вопросом, а не кодом для дебагера (который на куске работать как раз и не будет...), но то чтобы вопросы были грамотными (см ссылку)...
вообще, как кто то сказал, вопрос должен содержать половину ответа иначе это не вопрос (ну или что то типа, не дословно в общем). и если бы ты хотя бы попытался составить правильный вопрос. то возможно сам нашел бы ответ...
> спасибо за помощь
пожалуйста. и что бы ты там не думал это действительно помощь. (чувствуется сарказм в твоем спасибо...)
Страницы: 1 вся ветка
Текущий архив: 2010.08.27;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.071 c