![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Корректное создание массива из пользовательских структур. [D7]
justnick © (2006-05-03 19:53:00)Привет всем. У меня тут проблемка с массивом структур. Вот выдержки из кода:
type
TMyRecord = record
var1, var2: Double;
// и т.д. всего на 272 байта
end;
TForm1 = class(TForm)
public
MRA: array of TMyRecord;
IA: array of Integer;
procedure MRACalc(var MR: TMyRecord);
end;
implementation
procedure TForm1.Button1Click(Sender: TObject);
begin
// создаю MRA, пробовал через setLength и GetMem
SetLength(MRA, N);
// GetMem(MRA, SizeOf(TMyRecord) * N);
// создаю и инициализирую массив IA
SetLength(IA, M);
for i := 0 to M - 1 do IA[i] := i;
// на этом работа с IA в данной процедуре заканчивается
// далее идет довольно большой блок операций с MRA и вызовом проедуры MRACalc
end;
так вот. по завершению этого события массив IA деформируется. у него изменяется общее количество элементов, и сами значения элементов тоже меняются, вплоть до чисел с плавающей точкой (по крайней мере так дебаггер показывает). Но если создавать IA раньше чем MRA то все работает нормально. Отсюда сделал вывод, что не корректно создаю MRA (хотя операции с любым из его элементов работают без сбоев). Подскажите плз где лажанулся, а то не охота потенциальную багу оставлять.
Мефисто (2006-05-03 21:19:00) [21]Вах!... Черт ногу сломит в таком коде =)
Еще покажи MRACalc ();
>> for i := 0 to RCount - 1 do begin
>> for j := 0 to CCount - 1 do begin
Всегда ли 100% вероятностью выполняются данные условия т.е. циклы?
Мефисто (2006-05-03 21:13:00) [22]Вах!... Черт ногу в этом коде сломит =)
Еще бы покажи чего MRACalc(); делает внутри.
>> for i := 0 to RCount - 1 do begin
Всегда ли выполняется данный цикл?
justnick (2006-05-03 20:58:00) [23]это процедура пересчета структуры
procedure TForm1.MRACalc (var MR: TMyRecord);
begin
With MR do begin
ai := X2 * Y3 - X3 * Y2; // (XjYk - XkYj)
aj := X3 * Y1 - X1 * Y3; // (XkYi - XiYk)
ak := X1 * Y2 - X2 * Y1; // (XiYj - XjYi)
bi := Y2 - Y3; // (Yj - Yk)
bj := Y3 - Y1; // (Yk - Yi)
bk := Y1 - Y2; // (Yi - Yj)
ci := X3 - X2; // (Xk - Xj)
cj := X1 - X3; // (Xi - Xk)
ck := X2 - X1; // (Xj - Xi)
DIDPiPi := 2*bi*bi*(1 - WxW_div_CxC*rebro*rebro/24) +
2*ci*ci*(1 - WxW_div_CxC*rebro*rebro/ 8) -
2*ai*ai*(WxW_div_CxC) -
2*ai*ci*(WxW_div_CxC*rebro/sqrt(3));
DIDPiPj := 2*bi*bj*(1 - WxW_div_CxC*rebro*rebro/24) +
2*ci*cj*(1 - WxW_div_CxC*rebro*rebro/ 8) -
2*ai*aj*WxW_div_CxC -
(aj*ci + ai*cj)*(WxW_div_CxC*rebro/sqrt(3));
DIDPiPk := 2*bi*bk*(1 - WxW_div_CxC*rebro*rebro/24) +
2*ci*ck*(1 - WxW_div_CxC*rebro*rebro/ 8) -
2*ai*ak*WxW_div_CxC -
(ak*ci + ai*ck)*(WxW_div_CxC*rebro/sqrt(3));
//---------------------------------------------------------------------
DIDPjPi := 2*bi*bj*(1 - WxW_div_CxC*rebro*rebro/24) +
2*ci*cj*(1 - WxW_div_CxC*rebro*rebro/ 8) -
2*ai*aj*WxW_div_CxC -
(aj*ci + ai*cj)*(WxW_div_CxC*rebro/sqrt(3));
DIDPjPj := 2*bj*bj*(1 - WxW_div_CxC*rebro*rebro/24) +
2*cj*cj*(1 - WxW_div_CxC*rebro*rebro/ 8) -
2*aj*aj*WxW_div_CxC -
2*aj*cj*(WxW_div_CxC*rebro/sqrt(3));
DIDPjPk := 2*bj*bk*(1 - WxW_div_CxC*rebro*rebro/24) +
2*cj*ck*(1 - WxW_div_CxC*rebro*rebro/ 8) -
2*aj*ak*WxW_div_CxC -
(ak*cj + aj*ck)*(WxW_div_CxC*rebro/sqrt(3));
//---------------------------------------------------------------------
DIDPkPi := 2*bi*bk*(1 - WxW_div_CxC*rebro*rebro/24) +
2*ci*ck*(1 - WxW_div_CxC*rebro*rebro/ 8) -
2*ai*ak*WxW_div_CxC -
(ak*ci + ai*ck)*(WxW_div_CxC*rebro/sqrt(3));
DIDPkPj := 2*bj*bk*(1 - WxW_div_CxC*rebro*rebro/24) +
2*cj*ck*(1 - WxW_div_CxC*rebro*rebro/ 8) -
2*aj*ak*WxW_div_CxC -
(ak*cj + aj*ck)*(WxW_div_CxC*rebro/sqrt(3));
DIDPkPk := 2*bk*bk*(1 - WxW_div_CxC*rebro*rebro/24) +
2*ck*ck*(1 - WxW_div_CxC*rebro*rebro/ 8) -
2*ak*ak*WxW_div_CxC -
2*ak*ck*(WxW_div_CxC*rebro/sqrt(3));
Calculated := true;
end;
end;
все вышенаписанное работает без ошибок, за исключением той о которой говорил в первом посте
justnick (2006-05-03 20:56:00) [24]это продолжение события на кнопке
MRA[0].X1 := x1;
MRA[0].Y1 := y1;
MRA[0].X2 := x1 + l/2;
MRA[0].Y2 := y1 + l * sqrt(3)/2;
MRA[0].X3 := x1 - l/2;
MRA[0].Y3 := y1 + l * sqrt(3)/2;
MRA[0].up := true;
MRA[0].Index := 1;
MRA[0].i := 1;
MRA[0].j := PCCount + 2;
MRA[0].k := PCCount + 1;
MRACalc(MRA[0]);
for i := 0 to RCount - 1 do begin
for j := 0 to CCount - 1 do begin
if j + 1 < CCount then begin
if MRA[i * CCount + j].UP then begin
MRA[i * CCount + j + 1].UP := false;
MRA[i * CCount + j + 1].X1 := MRA[i * CCount + j].X2;
MRA[i * CCount + j + 1].Y1 := MRA[i * CCount + j].Y2;
MRA[i * CCount + j + 1].X2 := MRA[i * CCount + j].X1;
MRA[i * CCount + j + 1].Y2 := MRA[i * CCount + j].Y1;
MRA[i * CCount + j + 1].X3 := MRA[i * CCount + j].X1 + l;
MRA[i * CCount + j + 1].Y3 := MRA[i * CCount + j].Y1;
MRA[i * CCount + j + 1].i := MRA[i * CCount + j].j;
MRA[i * CCount + j + 1].j := MRA[i * CCount + j].i;
MRA[i * CCount + j + 1].k := MRA[i * CCount + j].i + 1;
end else begin
MRA[i * CCount + j + 1].UP := true;
MRA[i * CCount + j + 1].X1 := MRA[i * CCount + j].X3;
MRA[i * CCount + j + 1].Y1 := MRA[i * CCount + j].Y3;
MRA[i * CCount + j + 1].X2 := MRA[i * CCount + j].X1 + l;
MRA[i * CCount + j + 1].Y2 := MRA[i * CCount + j].Y1;
MRA[i * CCount + j + 1].X3 := MRA[i * CCount + j].X1;
MRA[i * CCount + j + 1].Y3 := MRA[i * CCount + j].Y1;
MRA[i * CCount + j + 1].i := MRA[i * CCount + j].k;
MRA[i * CCount + j + 1].j := MRA[i * CCount + j].i + 1;
MRA[i * CCount + j + 1].k := MRA[i * CCount + j].i;
end;
end else begin
if MRA[i * CCount + j].UP then begin
if (CCount mod 2) <> 0 then begin
MRA[i * CCount + j + 1].UP := false;
MRA[i * CCount + j + 1].X1 := MRA[(i-1) * CCount + j + 1].X3 + l/2;
MRA[i * CCount + j + 1].Y1 := MRA[(i-1) * CCount + j + 1].Y3 + l*sqrt(3)/2;
MRA[i * CCount + j + 1].X2 := MRA[(i-1) * CCount + j + 1].X3;
MRA[i * CCount + j + 1].Y2 := MRA[(i-1) * CCount + j + 1].Y3;
MRA[i * CCount + j + 1].X3 := MRA[(i-1) * CCount + j + 1].X2;
MRA[i * CCount + j + 1].Y3 := MRA[(i-1) * CCount + j + 1].Y2;
MRA[i * CCount + j + 1].i := PCCount*i+1;
MRA[i * CCount + j + 1].j := MRA[(i-1) * CCount + j + 1].k;
MRA[i * CCount + j + 1].k := MRA[(i-1) * CCount + j + 1].j;
end else begin
MRA[i * CCount + j + 1].UP := true;
MRA[i * CCount + j + 1].X1 := MRA[(i-1) * CCount + j + 1].X1;
MRA[i * CCount + j + 1].Y1 := MRA[(i-1) * CCount + j + 1].Y1;
MRA[i * CCount + j + 1].X2 := MRA[(i-1) * CCount + j + 1].X1 + l/2;
MRA[i * CCount + j + 1].Y2 := MRA[(i-1) * CCount + j + 1].Y1 + l * sqrt(3) / 2;
MRA[i * CCount + j + 1].X3 := MRA[(i-1) * CCount + j + 1].X1 - l/2;
MRA[i * CCount + j + 1].Y3 := MRA[(i-1) * CCount + j + 1].Y1 + l * sqrt(3) / 2;
MRA[i * CCount + j + 1].i := MRA[(i-1) * CCount + j + 1].i;
MRA[i * CCount + j + 1].j := PCCount*(i + 2)+2;
MRA[i * CCount + j + 1].k := PCCount*(i + 2)+1;
end;
end else begin
if (CCount mod 2) <> 0 then begin
MRA[i * CCount + j + 1].UP := true;
MRA[i * CCount + j + 1].X1 := MRA[(i-1) * CCount + j + 1].X1;
MRA[i * CCount + j + 1].Y1 := MRA[(i-1) * CCount + j + 1].Y1;
MRA[i * CCount + j + 1].X2 := MRA[(i-1) * CCount + j + 1].X1 + l/2;
MRA[i * CCount + j + 1].Y2 := MRA[(i-1) * CCount + j + 1].Y1 + l * sqrt(3) / 2;
MRA[i * CCount + j + 1].X3 := MRA[(i-1) * CCount + j + 1].X1 - l/2;
MRA[i * CCount + j + 1].Y3 := MRA[(i-1) * CCount + j + 1].Y1 + l * sqrt(3) / 2;
MRA[i * CCount + j + 1].i := MRA[(i-1) * CCount + j + 1].i;
MRA[i * CCount + j + 1].j := PCCount*i+1;
MRA[i * CCount + j + 1].k := PCCount*i+2;
end else begin
MRA[i * CCount + j + 1].UP := false;
MRA[i * CCount + j + 1].X1 := MRA[(i-1) * CCount + j + 1].X3 + l/2;
MRA[i * CCount + j + 1].Y1 := MRA[(i-1) * CCount + j + 1].Y3 + l*sqrt(3)/2;
MRA[i * CCount + j + 1].X2 := MRA[(i-1) * CCount + j + 1].X3;
MRA[i * CCount + j + 1].Y2 := MRA[(i-1) * CCount + j + 1].Y3;
MRA[i * CCount + j + 1].X3 := MRA[(i-1) * CCount + j + 1].X2;
MRA[i * CCount + j + 1].Y3 := MRA[(i-1) * CCount + j + 1].Y2;
MRA[i * CCount + j + 1].i := PCCount*(i+2)+1;
MRA[i * CCount + j + 1].j := MRA[(i-1) * CCount + j + 1].k;
MRA[i * CCount + j + 1].k := MRA[(i-1) * CCount + j + 1].j;
end;
end;
end;
MRACalc(MRA[i * CCount + j + 1]);
end;
end;
justnick (2006-05-03 20:56:00) [25]вот полное описание структуры
TMyRecord = record
X1,Y1: Double;
X2,Y2: Double;
X3,Y3: Double;
ai, bi, ci: Double;
aj, bj, cj: Double;
ak, bk, ck: Double;
i, j, k: Integer;
Pi,Pj,Pk: Double;
Index: Integer;
DIDPiPi, DIDPiPj, DIDPiPk, DIDPiC: Double;
DIDPjPi, DIDPjPj, DIDPjPk, DIDPjC: Double;
DIDPkPi, DIDPkPj, DIDPkPk, DIDPkC: Double;
UP: Boolean;
Calculated: Boolean;
end;
Мефисто (2006-05-03 20:00:00) [26]// далее идет довольно большой блок операций с MRA и вызовом проедуры MRACalc
Вот его бы и желательно лицезреть