Описание функции в FPC

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Re: Описание функции в FPC

Сообщение bw » 10.12.2008 17:15:08

Код большой? Выложи, если не жалко.
Или повтори ошибку в другом, который не жалко показать общественности.

p.s. А, черт. "Сорвал" счетчик. Такая цифра была.

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Re: Описание функции в FPC

Сообщение badgunn » 10.12.2008 17:47:20

Вот код.. Это прога расчёта тепловых полей объекта, работает в консоли(я не программист-жизнь заставила :D ). Объект разбивается на "кубики" и в каждом по формулам специальным считается температура(формулы сложные поэтому и выражения в проге бешеные). Трёхмерные массивы хранят физические параметры "кубиков" и их температуру.
Код: Выделить всё
program Termo_areas;

uses CRT,math;

type
cub=record
  v,c,lambda,p_ist: Real;
end;
buf=array[1..6] of Real;

const
c_vozd=1299; lambda_vozd=0.026;

var
l,w,h: Real;
ln,wn,hn,i,j,k,num,g: Word;
lcub,wcub,hcub,vcub,temp0,time,t_step,t,ixp,ixm,iyp,iym,izp,izm: Real;
temp: array [1..100,1..100,1..100] of Real;
cubic: array [1..100,1..100,1..100] of cub;
c_num,v_num,lambda_num: buf;
ch: Char;

function h_i(n:Word; a:buf):Real;
var
  l: Word;
  s1,s2: Real;

begin
  s1:=0; s2:=0;
  if n=1 then h_i:=power(a[1],1/3) else
  begin
  for l:=n downto 2 do
   begin
    s1:=s1+a[l];
    s2:=s2+a[l-1];
   end;
  s1:=s1+a[1];
  h_i:=power(s1,1/3)-power(s2,1/3);
  end;
end;

function lam_i(n:Word; vc:Real; v,lam:buf): Real;
var
  l:Word;
  p,lp,ls: Real;
begin
  p:=0; lp:=1; ls:=0;
  for l:=1 to n do lp:=lp*lam[l];
  for l:=1 to n do ls:=ls+lp*h_i(l,v);
  for l:=1 to n do p:=p+(sqr(h_i(l,v))*lp);
  lam_i:=p/(ls*power(vc,1/3));
end;

begin  {Начало программы}

repeat     {Ввод общих данных о модели}
  ClrScr;
  Write('Введите длину: '); Read(l);
  Write('Введите ширину: '); Read(w);
  Write('Введите высоту: '); Read(h);
  Writeln('---------------------------------------');
  Write('Введите количество разбиений по длине: '); Read(ln);
  Write('Введите количество разбиений по ширине: '); Read(wn);
  Write('Введите количество разбиений по высоте: '); Read(hn);
  Writeln('---------------------------------------');
  lcub:=l/ln; wcub:=w/wn; hcub:=h/hn; vcub:=lcub*wcub*hcub;
  Writeln('Размеры элементарного объёма: ', lcub:5:3,' x',wcub:5:3,' x',hcub:5:3); Writeln;
  Write('Введите начальную температуру блока= '); read(temp0);
  Writeln;
  Writeln('Enter - ввод данных, Esc - ввести заново');
  ch:=Readkey;
until Ord(ch)=13;

for i:=1 to ln+2 do
begin
  for j:=1 to wn+2 do
  begin
   for k:=1 to hn+2 do
    begin
     temp[i,j,k]:=temp0;
     cubic[i,j,k].c:=c_vozd;
     cubic[i,j,k].lambda:=lambda_vozd;
    end;
  end;
end;

for k:=2 to hn+1 do  {Ввод данных для каждого "кубика"}
  begin
   for i:=2 to ln+1 do
    begin
     for j:=2 to wn+1 do {начало}
      begin
       Clrscr;
       Writeln('Координаты элемента (x,y,z): ',i-1,' ',j-1,' ',k-1);
       Write('Введите количество материалов в элементе(максимум 5) = '); Read(num);
       for g:=1 to num do
        begin
         repeat
          Writeln;
          Writeln('Материал №',g);
          Writeln('============================');
          Write('Удельная теплоёмкость='); Read(c_num[g]);
          Write('Коэффициент теплопроводности='); Read(lambda_num[g]);
          Write('Объём материала в элементе='); Read(v_num[g]);
          Writeln('----------------------------');Writeln;
          Write('Enter - ввод данных, Esc - ввести заново');
          ch:=Readkey;
         until Ord(ch)=13;
        end;
       Writeln;
       Write('Введите мощность источников тепла='); Read(cubic[i,j,k].p_ist);

       cubic[i,j,k].v:=0;

       for g:=1 to num do begin cubic[i,j,k].v:=cubic[i,j,k].v+v_num[g]; end;

       cubic[i,j,k].c:=((vcub-cubic[i,j,k].v)*c_vozd)/vcub;{Слагаемое экв. теплоёмкости для заполнителя(воздух)}

       for g:=1 to num do cubic[i,j,k].c:=cubic[i,j,k].c+(v_num[g]*c_num[g])/vcub;{Вычисление экв. теплоёмкости}

       cubic[i,j,k].lambda:=lam_i(num,vcub,v_num,lambda_num); {Вычисление экв. коэфф-та теплопроводности}

      end;       {конец}
    end;
  end;

  repeat
   Writeln;
   Write('Введите время наблюдения, с: '); read(time);
   Write('Введите шаг времени, с: '); read(t_step); Writeln;
   Write('-----------------------------');
   Write('Enter - ввод данных, Esc - ввести заново');
   ch:=Readkey;
  until ord(ch)=13;

t:=0;
repeat
for k:=1 to hn+1 do
begin
  for i:=1 to ln+1 do
  begin
   for j:=1 to wn+1 do
    begin
     ixp:=((cubic[i,j,k].lambda+cubic[i+1,j,k].lambda)*t_step)/(2*sqr(lcub)*cubic[i,j,k].c)*(temp[i+1,j,k]-temp[i,j,k]);
     ixm:=((cubic[i,j,k].lambda+cubic[i+1,j,k].lambda)*t_step)/(2*sqr(lcub)*cubic[i,j,k].c)*(temp[i,j,k]-temp[i-1,j,k]);
     iyp:=((cubic[i,j,k].lambda+cubic[i,j+1,k].lambda)*t_step)/(2*sqr(wcub)*cubic[i,j,k].c)*(temp[i,j+1,k]-temp[i,j,k]);
     iym:=((cubic[i,j,k].lambda+cubic[i,j+1,k].lambda)*t_step)/(2*sqr(wcub)*cubic[i,j,k].c)*(temp[i,j,k]-temp[i,j-1,k]);
     izp:=((cubic[i,j,k].lambda+cubic[i,j,k+1].lambda)*t_step)/(2*sqr(hcub)*cubic[i,j,k].c)*(temp[i,j,k+1]-temp[i,j,k]);
     izm:=((cubic[i,j,k].lambda+cubic[i,j,k+1].lambda)*t_step)/(2*sqr(hcub)*cubic[i,j,k].c)*(temp[i,j,k]-temp[i,j,k-1]);
     temp[i,j,k]:=temp[i,j,k]+(c_vozd/cubic[i,j,k].c)*(ixp-ixm+iyp-iym+izp-izm)+((cubic[i,j,k].p_ist*t)/cubic[i,j,k].c);
    end;
  end;
end;
t:=t+t_step;
until t>time;

repeat
  Clrscr;
  Writeln;
  Write('Введите номер слоя по координате Z (высота): ');Read(num);
  for i:=1 to ln+2 do
   begin
    for j:=1 to wn+2 do
     begin
      write(temp[i,j,num]:5:4);
     end;
   Writeln; Writeln;
   end;
  Writeln('-----------------------------');
  Writeln('Enter - вывод следующего слоя, Esc - выход');
  ch:=Readkey;
until ord(ch)=27;

end.{Конец программы}




Добавлено спустя 3 минуты 28 секунд:
Забыл...Прога компилируется и запускается. Позволяет ввести данные и вылетает с ошибкой 217(знать бы что это за ошибка!)
badgunn
новенький
 
Сообщения: 12
Зарегистрирован: 06.12.2008 16:16:05
Откуда: Самара

Re: Описание функции в FPC

Сообщение bw » 10.12.2008 18:27:33

Везде ввел единицы и это не вызвало ошибок (Linux, FPC 2.2.0).
При каких данных возникает ошибка (просто цифры по порядку укажите, только поменьше :-)?
Соберите прогу в "отладочном режиме", в консоли это обычно флаг -dDEBUG.

p.s. При падении будет выведено много отладочной информации. Это точка падения и traceback (не знаю как по русски сказать :-).

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Re: Описание функции в FPC

Сообщение badgunn » 10.12.2008 18:55:02

Цифры такие длина 0,2 ширина 0,14 высота 0,06 кол-во разбиений 3 2 2, колво материалов можно для проверки взять везде 1. параметры материалов теплоёмкость - большое число, порядка 1000000 , коэфф теплопроводности - меньше 1, объём - 0,000001(проимерно такой порядок), время наблюдения - 1, шаг времени - 0,2. Вот как-то так!! А можно поподробнее про флаг -dDEBUG - что нужно сделать?(по порядку) :roll: (где что писать)

Добавлено спустя 1 минуту 29 секунд:
Опять забыл спросить... а на экран она(прога) что-нибудь выводит? :oops:
badgunn
новенький
 
Сообщения: 12
Зарегистрирован: 06.12.2008 16:16:05
Откуда: Самара

Re: Описание функции в FPC

Сообщение bw » 10.12.2008 19:21:35

> А можно поподробнее про флаг -dDEBUG - что нужно сделать?
Ну я работаю только с консолью, сейчас гляну, где это в IDE, вы ведь с ней работаете?

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Re: Описание функции в FPC

Сообщение badgunn » 10.12.2008 19:37:42

да

Добавлено спустя 9 минут 34 секунды:
а на экран она(прога) что-нибудь выводит?
badgunn
новенький
 
Сообщения: 12
Зарегистрирован: 06.12.2008 16:16:05
Откуда: Самара

Re: Описание функции в FPC

Сообщение bw » 10.12.2008 20:47:30

> а на экран она(прога) что-нибудь выводит?
Всё. Куча непонятных вопросов. Потом еще вопросы. Я их даже не читаю.

Добавлено спустя 14 часов 41 минуту 10 секунд:
> Прога компилируется и запускается. Позволяет ввести данные и вылетает с ошибкой 217(знать бы что это за ошибка!)
Runtime error 217 = Unhandled exception occurred
В 14 главе (или приложение D, у кого как) Users' manual for Free Pascal идет описание кодов ошибок.

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Re: Описание функции в FPC

Сообщение Михаил Крамер » 11.12.2008 11:58:31

Я вот думаю, а не возникает ли у Вас переполнение буфера. Всё таки у вас buf описан как массив на 6 элементов, а счётчик на превышение 6 вы не проверяете... А разбираться в тонкостях алгоритма, извините, нет охоты...
Михаил Крамер
новенький
 
Сообщения: 73
Зарегистрирован: 08.02.2008 14:26:40

Re: Описание функции в FPC

Сообщение badgunn » 11.12.2008 21:05:24

Протестировал каждую функциональную часть проги(ввод данных, ввод параметров кубиков и т.д.) всё прекрасно работает без куска кода, где непосредственно и выполняется задача программы(кусок кода где большие формулы :) ). Думаю ошибка всё же там...Что интересно, у моего товарища код прекрасно скомпилировался и выполнился, но вместо некоторых цифр вывелось вот это "Nan"...
badgunn
новенький
 
Сообщения: 12
Зарегистрирован: 06.12.2008 16:16:05
Откуда: Самара

Re: Описание функции в FPC

Сообщение bw » 12.12.2008 07:55:23

Попробуйте вместо Real использовать Double или Extended.

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Re: Описание функции в FPC

Сообщение Михаил Крамер » 12.12.2008 15:09:57

bw скорее всего прав. Nan - это Not A Number - не число. Так что просто происходит переполнение разрядности, по видимому.
Михаил Крамер
новенький
 
Сообщения: 73
Зарегистрирован: 08.02.2008 14:26:40

Re: Описание функции в FPC

Сообщение badgunn » 13.12.2008 13:13:01

Спасибо всем, кто пытался мне помочь. Всё заработало, а ошибка была идиотской на самом деле(индекс массива в одной из формул принимал недопустимое значение) :idea:
badgunn
новенький
 
Сообщения: 12
Зарегистрирован: 06.12.2008 16:16:05
Откуда: Самара

Re: Описание функции в FPC

Сообщение Михаил Крамер » 15.12.2008 14:43:30

Ха, я был прав в своём первой догадке - переполнние буфера..
Михаил Крамер
новенький
 
Сообщения: 73
Зарегистрирован: 08.02.2008 14:26:40

Пред.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru