Форум: "Основная";
Текущий архив: 2018.09.23;
Скачать: [xml.tar.bz2];
ВнизStack Overflow Найти похожие ветки
← →
tButton © (2013-01-29 08:58) [0]есть код
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 <= 0 then continue; // õîòÿ, êîíå÷íî, ýòî òðàãåäèÿ ;)
lat := ((y - 128) / 256) * PI; // øèðîòà
lat := cos(lat);
// ñ÷èòàåì âåñà äëÿ íàïðàâëåíèé
ws := 0;
for n := 0 to 7 do begin
wgt[n] := 0; // ïî óìîë÷àíèþ - 0
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;
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
← →
TButton © (2013-01-29 09:03) [1]поменял порядок декларации массивов — стал вылетать buff
т.е. второй задекларированный массив стабильно вылетает.
можно попробовать соорудить костыль, но разобраться в причине — лучше.
← →
MBo © (2013-01-29 09:07) [2]Размеры локальных переменных buff и cloud по 528392 байт. Локальные переменные - статические массивы, они располагаются в стеке, и их суммарный размер превышает обычный размер стека в 1 мегабайт.
А вообще код надо переработать, у него турбопаскальные уши.
← →
TButton © (2013-01-29 09:16) [3]
> MBo © (29.01.13 09:07) [2]
большое спасибо
> А вообще код надо переработать, у него турбопаскальные уши.
надо, хотя про уши не совсем понял. от объектов к классам перейти?
← →
Anatoly Pogoretsky (2013-01-29 09:38) [4]> MBo (29.01.2013 09:07:02) [2]
Сначала надо от Бейсика и
фортрана уйти
← →
MBo © (2013-01-29 09:43) [5]объекты лучше в классы, real в double, массивы где-то, возможно, динамические
← →
Dimka Maslov © (2013-01-30 21:18) [6]var
Buf, Cloud: PMatrix;
begin
GetMem(Buf, SizeOf(TMatrix));
try
GetMem(Cloud, SizeOf(TMatrix));
try
// далее по тексту
finally
FreeMem(Cloud);
end;
finally
FreeMem(Buf);
end;
end;
← →
Игорь Шевченко © (2013-01-30 23:08) [7]
> real в double
Это уже в сам язык встроено, AFAIK
← →
MBo © (2013-01-31 05:47) [8]>Это уже в сам язык встроено, AFAIK
Да, действительно, типы эквивалентны, мне почему-то казалось, что опция компилятора за это отвечала (как с длинными строками)
← →
Anatoly Pogoretsky (2013-01-31 09:37) [9]> MBo (31.01.2013 05:47:08) [8]
Так и есть. Есть опция как
трактовать real как real48 или ка
double
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2018.09.23;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.001 c