Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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; // &#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.002 c
15-1474373519
Kipor
2016-09-20 15:11
2018.09.23
IDE Delphi XE - стираются bookmark в режиме DFM


1-1359435539
tButton
2013-01-29 08:58
2018.09.23
Stack Overflow


2-1471034827
Pavor
2016-08-12 23:47
2018.09.23
Отображение документа с полями Edit, метками, изображениями..


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский