Описание функции в FPC
Модератор: Модераторы
Вот код.. Это прога расчёта тепловых полей объекта, работает в консоли(я не программист-жизнь заставила
). Объект разбивается на "кубики" и в каждом по формулам специальным считается температура(формулы сложные поэтому и выражения в проге бешеные). Трёхмерные массивы хранят физические параметры "кубиков" и их температуру.
Добавлено спустя 3 минуты 28 секунд:
Забыл...Прога компилируется и запускается. Позволяет ввести данные и вылетает с ошибкой 217(знать бы что это за ошибка!)
Код: Выделить всё
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(знать бы что это за ошибка!)
- bw
- постоялец
- Сообщения: 359
- Зарегистрирован: 01.12.2005 10:36:23
- Откуда: Усть-Илимск
- Контактная информация:
Везде ввел единицы и это не вызвало ошибок (Linux, FPC 2.2.0).
При каких данных возникает ошибка (просто цифры по порядку укажите, только поменьше :-)?
Соберите прогу в "отладочном режиме", в консоли это обычно флаг -dDEBUG.
p.s. При падении будет выведено много отладочной информации. Это точка падения и traceback (не знаю как по русски сказать :-).
..bw
При каких данных возникает ошибка (просто цифры по порядку укажите, только поменьше :-)?
Соберите прогу в "отладочном режиме", в консоли это обычно флаг -dDEBUG.
p.s. При падении будет выведено много отладочной информации. Это точка падения и traceback (не знаю как по русски сказать :-).
..bw
Цифры такие длина 0,2 ширина 0,14 высота 0,06 кол-во разбиений 3 2 2, колво материалов можно для проверки взять везде 1. параметры материалов теплоёмкость - большое число, порядка 1000000 , коэфф теплопроводности - меньше 1, объём - 0,000001(проимерно такой порядок), время наблюдения - 1, шаг времени - 0,2. Вот как-то так!! А можно поподробнее про флаг -dDEBUG - что нужно сделать?(по порядку)
(где что писать)
Добавлено спустя 1 минуту 29 секунд:
Опять забыл спросить... а на экран она(прога) что-нибудь выводит?
Добавлено спустя 1 минуту 29 секунд:
Опять забыл спросить... а на экран она(прога) что-нибудь выводит?
да
Добавлено спустя 9 минут 34 секунды:
а на экран она(прога) что-нибудь выводит?
Добавлено спустя 9 минут 34 секунды:
а на экран она(прога) что-нибудь выводит?
- bw
- постоялец
- Сообщения: 359
- Зарегистрирован: 01.12.2005 10:36:23
- Откуда: Усть-Илимск
- Контактная информация:
> а на экран она(прога) что-нибудь выводит?
Всё. Куча непонятных вопросов. Потом еще вопросы. Я их даже не читаю.
Добавлено спустя 14 часов 41 минуту 10 секунд:
> Прога компилируется и запускается. Позволяет ввести данные и вылетает с ошибкой 217(знать бы что это за ошибка!)
Runtime error 217 = Unhandled exception occurred
В 14 главе (или приложение D, у кого как) Users' manual for Free Pascal идет описание кодов ошибок.
..bw
Всё. Куча непонятных вопросов. Потом еще вопросы. Я их даже не читаю.
Добавлено спустя 14 часов 41 минуту 10 секунд:
> Прога компилируется и запускается. Позволяет ввести данные и вылетает с ошибкой 217(знать бы что это за ошибка!)
Runtime error 217 = Unhandled exception occurred
В 14 главе (или приложение D, у кого как) Users' manual for Free Pascal идет описание кодов ошибок.
..bw
-
Михаил Крамер
- новенький
- Сообщения: 73
- Зарегистрирован: 08.02.2008 13:26:40
Я вот думаю, а не возникает ли у Вас переполнение буфера. Всё таки у вас buf описан как массив на 6 элементов, а счётчик на превышение 6 вы не проверяете... А разбираться в тонкостях алгоритма, извините, нет охоты...
Протестировал каждую функциональную часть проги(ввод данных, ввод параметров кубиков и т.д.) всё прекрасно работает без куска кода, где непосредственно и выполняется задача программы(кусок кода где большие формулы
). Думаю ошибка всё же там...Что интересно, у моего товарища код прекрасно скомпилировался и выполнился, но вместо некоторых цифр вывелось вот это "Nan"...
-
Михаил Крамер
- новенький
- Сообщения: 73
- Зарегистрирован: 08.02.2008 13:26:40
bw скорее всего прав. Nan - это Not A Number - не число. Так что просто происходит переполнение разрядности, по видимому.
Спасибо всем, кто пытался мне помочь. Всё заработало, а ошибка была идиотской на самом деле(индекс массива в одной из формул принимал недопустимое значение) 
-
Михаил Крамер
- новенький
- Сообщения: 73
- Зарегистрирован: 08.02.2008 13:26:40
Ха, я был прав в своём первой догадке - переполнние буфера..
