Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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
т.е. второй задекларированный массив стабильно вылетает.
можно попробовать соорудить костыль, но разобраться в причине — лучше.


Наверх

Титульная страница Поиск, карта сайта Написать письмо