Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2018.09.23;
Скачать: CL | DM;

Вниз

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; // &#245;&#238;&#242;&#255;, &#234;&#238;&#237;&#229;&#247;&#237;&#238;, &#253;&#242;&#238; &#242;&#240;&#224;&#227;&#229;&#228;&#232;&#255; ;)
     lat := ((y - 128) / 256) * PI; // &#248;&#232;&#240;&#238;&#242;&#224;
     lat := cos(lat);
     // &#241;&#247;&#232;&#242;&#224;&#229;&#236; &#226;&#229;&#241;&#224; &#228;&#235;&#255; &#237;&#224;&#239;&#240;&#224;&#226;&#235;&#229;&#237;&#232;&#233;
     ws := 0;
     for n := 0 to 7 do begin
       wgt[n] := 0; // &#239;&#238; &#243;&#236;&#238;&#235;&#247;&#224;&#237;&#232;&#254; - 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) -                            // &#231;&#228;&#229;&#241;&#252; &#237;&#243;&#230;&#237;&#238; &#226;&#226;&#229;&#241;&#242;&#232; &#234;&#238;&#253;&#244;&#244;&#232;&#246;&#232;&#253;&#237;&#242;&#251;
             (grid[cx, cy].water + grid[cx, cy].rock + grid[cx, cy].air) * (1 - blow[n] * lat); // &#242;&#229;&#236;&#239;&#229;&#240;&#224;&#242;&#243;&#240;&#237;&#238;&#227;&# 238; &#240;&#224;&#241;&#248;&#232;&#240;&#229;&#237;&#232;&#255; &#226;&#238;&#231;&#228;&#243;&#245;&#224;
       sq := sq / d_w[n];

       if (sq < 0) then sq := 0; // &#236;&#232;&#237;&#243;&#241;&#238;&#226;&#251;&#229; &#226;&#229;&#241;&#224; &#237;&#224;&#236; &#237;###&#233; &#237;&#229; &#237;&#243;&#230;&#237;&#251;
       wgt[n] := sq;
       ws := ws + sq;
     end;
     // &#239;&#240;&#232;&#226;&#238;&#228;&#232;&#236; &#226;&#229;&#241;&#224; &#234; &#229;&#228;&#232;&#237;&#232;&#246;&#229;
     if ws > 0 then
       for n := 0 to 7 do
         wgt[n] := wgt[n] / ws;
     // &#240;&#224;&#241;&#234;&#232;&#228;&#251;&#226;&#224;&#229;&#236; &#247;&#224;&#241;&#242;&#252; &#238;&#225;&#250;ё&#236;&#224; &#226;&#238;здуха &#239;&#238; &#241;&#238;&#241;&#229;&#228;&#237;&#232;&#236; узлам &#226; &#241;&#238;&#238;&#242;&#226;&#229;&#242;&#241;&#242;&#226;&#232;&#232; &#241; &#226;&#229;&#241;&#224;&#236;&#232;
     ws := grid[x, y].air * part;   // &#241;&#234;&#238;&#235;&#252;&#234;&#238; &#240;&#224;&#241;&#234;&#232;&#228;&#224;&#242;&#252;
     sq := 0;                       // &#241;&#234;&#238;&#235;&#252;&#234;&#238; &#240;&#224;&#241;&#234;&#232;&#228;&#224;&#235;&#232; &#244;&#224;&#234;&#242;&#232;&#247;&#229;&#241;&#234;&#232;
     hum := grid[x, y].vapor / grid[x, y].air; // &#226;&#235;&#224;&#230;&#237;&#238;&#241;&#242;&#252;
     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; // &#239;&#229;&#240;&#229;&#236;&#229;&#249;&#224;&#229;&#236;&#238;&#229; &#234;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238;

       //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;
     // &#232;&#231; &#242;&#229;&#234;&#243;&#249;&#229;&#233; &#242;&#238;&#247;&#234;&#232; &#232;&#231;&#251;&#236;&#224;&#229;&#236; &#244;&#224;&#234;&#242;&#232;&#247;е&#241;&#234;&#232; &#240;&#224;&#241;&#234;&#232;&#228;&#224;&#237;&#251;&#233; &#238;&#225;&#250;ё&#236;
     buff[x, y] := buff[x, y] - sq;
   end;
 // &#239;&#240;&#232;&#236;&#229;&#237;&#255;&#229;&#236; &#225;&#243;&#244;&#229;&#240;
 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.003 c
1-1359435539
tButton
2013-01-29 08:58
2018.09.23
Stack Overflow


15-1474373519
Kipor
2016-09-20 15:11
2018.09.23
IDE Delphi XE - стираются bookmark в режиме DFM


2-1470668686
Денис11998833
2016-08-08 18:04
2018.09.23
Помогите пожалуйста найти ошибку в коде