![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Stack Overflow [D5, WinXP]
tButton © (2013-01-29 08:58:00)есть код
type
myLiquid = record
rock: real;
water: real;
vapor: real;
air: real;
end;
myTerrain = object
day: real;
side: real;
grid: array [0..256, 0..256] of myLiquid;
//procedure import(mesh: myMesh; size, height: real);
procedure reset;
procedure flow(part: real);
procedure vaporise(part: real);
procedure rain(part: real);
procedure wind(part: real);
end;
implementation
{ myTerrain }
...
procedure myTerrain.wind(part: real);
var
buff, cloud: array [0..256, 0..256] of real;
x, y, n: integer;
sh_x, sh_y: array [0..7] of integer;
d_w, wgt, blow: array [0..7] of real;
sq, ws, wp: real;
cx, cy: integer;
lat: real;
hum: real;
begin
// ÷èñòèì áóôåð
for x := 0 to 256 do
for y := 0 to 256 do begin
buff[x, y] := 0;
cloud[x, y] := 0;
end;
// ïîäãîòàâëèâàå 236; ìàñêè ñìåùåíèé
wp := side / 256; sq := sqrt(2) * wp;
sh_x[0] := -1; sh_y[0] := -1; d_w[0] := sq;
sh_x[1] := 0; sh_y[1] := -1; d_w[1] := wp;
sh_x[2] := 1; sh_y[2] := -1; d_w[2] := sq;
sh_x[3] := 1; sh_y[3] := 0; d_w[3] := wp;
sh_x[4] := 1; sh_y[4] := 1; d_w[4] := sq;
sh_x[5] := 0; sh_y[5] := 1; d_w[5] := wp;
sh_x[6] := -1; sh_y[6] := 1; d_w[6] := sq;
sh_x[7] := -1; sh_y[7] := 0; d_w[7] := wp;
// è åùё îäíà ìàñêà - ìàñêà åñòåñòâåííîãî äâèæåíèÿ âîçäóõà
blow[0] := 0;
blow[1] := 0;
blow[2] := 0.05;
blow[3] := 0.05;
blow[4] := 0.05;
blow[5] := 0;
blow[6] := 0;
blow[7] := 0;
// çàïîëíÿåì áóôåð
for x := 0 to 256 do
for y := 0 to 256 do begin
if grid[x, y].air 256) then continue;
if (cx < 0) then cx := cx + 257;
if (cx > 256) then cx := cx - 257;
sq := (grid[x, y].water + grid[x, y].rock + grid[x, y].air) - // çäåñü íóæíî ââåñòè êîýôôèöèýíòû
(grid[cx, cy].water + grid[cx, cy].rock + grid[cx, cy].air) * (1 - blow[n] * lat); // òåìïåðàòóðíîã 238; ðàñøèðåíèÿ âîçäóõà
sq := sq / d_w[n];
if (sq < 0) then sq := 0; // ìèíóñîâûå âåñà íàì í###é íå íóæíû
wgt[n] := sq;
ws := ws + sq;
end;
// ïðèâîäèì âåñà ê åäèíèöå
if ws > 0 then
for n := 0 to 7 do
wgt[n] := wgt[n] / ws;
// ðàñêèäûâàåì ÷àñòü îáúёìà âîздуха ïî ñîñåäíèì узлам â ñîîòâåòñòâèè ñ âåñàìè
ws := grid[x, y].air * part; // ñêîëüêî ðàñêèäàòü
sq := 0; // ñêîëüêî ðàñêèäàëè ôàêòè÷åñêè
hum := grid[x, y].vapor / grid[x, y].air; // âëàæíîñòü
for n := 0 to 7 do begin
cx := x + sh_x[n];
cy := y + sh_y[n];
if (cy < 0) or (cy > 256) then continue;
if (cx < 0) then cx := cx + 257;
if (cx > 256) then cx := cx - 257;
wp := wgt[n] * ws; // ïåðåìåùàåìîå êîëè÷åñòâî
//cloud[cx, cy] := cloud[cx, cy] + hum * wp;
//cloud[x, y] := cloud[x, y] - hum * wp;
buff[cx, cy] := buff[cx, cy] + wp;
sq := sq + wp;
end;
// èç òåêóùåé òî÷êè èçûìàåì ôàêòè÷еñêè ðàñêèäàíûé îáúёì
buff[x, y] := buff[x, y] - sq;
end;
// ïðèìåíÿåì áóôåð
for x := 0 to 256 do
for y := 0 to 256 do begin
grid[x, y].air := grid[x, y].air + buff[x, y];
//grid[x, y].vapor := grid[x, y].vapor + cloud[x, y];
end;
end;
end.
если в нём раскомментировать хотя бы одно обращение к массиву cloud (что и показано в начале процедуры) при выполнение прерывается на выделенной строке (begin) с ошибкой EStackOverflow
скриншот массива в инспекторе
http://clip2net.com/s/2LBCC
Anatoly Pogoretsky (2013-01-31 09:37:00) [1]> MBo (31.01.2013 05:47:08) [8]
Так и есть. Есть опция как
трактовать real как real48 или ка
double
MBo (2013-01-31 05:47:00) [2]>Это уже в сам язык встроено, AFAIK
Да, действительно, типы эквивалентны, мне почему-то казалось, что опция компилятора за это отвечала (как с длинными строками)
Игорь Шевченко (2013-01-30 23:08:00) [3]
> real в double
Это уже в сам язык встроено, AFAIK
Dimka Maslov (2013-01-30 21:18:00) [4]var
Buf, Cloud: PMatrix;
begin
GetMem(Buf, SizeOf(TMatrix));
try
GetMem(Cloud, SizeOf(TMatrix));
try
// далее по тексту
finally
FreeMem(Cloud);
end;
finally
FreeMem(Buf);
end;
end;
MBo (2013-01-29 09:43:00) [5]объекты лучше в классы, real в double, массивы где-то, возможно, динамические
Anatoly Pogoretsky (2013-01-29 09:38:00) [6]> MBo (29.01.2013 09:07:02) [2]
Сначала надо от Бейсика и
фортрана уйти
TButton (2013-01-29 09:16:00) [7]
> MBo © (29.01.13 09:07) [2]
большое спасибо
> А вообще код надо переработать, у него турбопаскальные уши.
надо, хотя про уши не совсем понял. от объектов к классам перейти?
MBo (2013-01-29 09:07:00) [8]Размеры локальных переменных buff и cloud по 528392 байт. Локальные переменные - статические массивы, они располагаются в стеке, и их суммарный размер превышает обычный размер стека в 1 мегабайт.
А вообще код надо переработать, у него турбопаскальные уши.
TButton (2013-01-29 09:03:00) [9]поменял порядок декларации массивов — стал вылетать buff
т.е. второй задекларированный массив стабильно вылетает.
можно попробовать соорудить костыль, но разобраться в причине — лучше.