Pascal - нипонятно...


гильдия Мудрецы (Грандмастер)[25914] гильдия Королевские Лабоходы (Адепт)[1898] Voide Информация
Назад к темам раздела.
2008-03-05 20:03:46 гильдия Мудрецы (Грандмастер)[25914] гильдия Королевские Лабоходы (Адепт)[1898] Voide Информация
Есть прога(упрощённый вариант);

Program dfgs;
Uses Crt,INTRFC;
Var Y1,A1,f:real;M,H:integer;WSPOM:massiv;
Begin
M:=10;
H:=80;
Readln(A1);
UPRAV(M,A1,WSPOM);
Delay(10000);
Opros(H,Y1,WSPOM);
Writeln(Y1);
readln;
end.

в модуле находитца две процедуры Управление(подаётся управ значение) Опрос(выдаёт измеренное значение);

И так две ситуации:

Обычный запуск:
Вводим управ значение
Выводится измеренное....равное НУЛЮ

Запуск в отладчике:

Вводим управ значение
Выводится измеренное нормальное значение не равное нулю...

Вопрос: Какого *** при обычном запуске выводится НОЛЬ?

нашедшему причину этой фигни дам 1к монет
 
2008-03-05 20:20:27 гильдия Столичные Шахтеры (Мастер)[3723] гильдия Мудрецы (Мастер)[5097] Фёдор_Сумкин Информация
Voide
я так понял У1 глобальная переменная?
ты уверен что функция опрос присваивает ей посчитанное значение?

и что возвращает эта функция непонятно, если значение У1, то попробуй присвоить
Х1=Opros(H,Y1,WSPOM);
Writeln(Х1);
или она возвр. только массив WSPOM?

имхо главная запарка с тем что у тебя глобальные переменные
 
2008-03-05 20:24:13 гильдия Мудрецы (Грандмастер)[25914] гильдия Королевские Лабоходы (Адепт)[1898] Voide Информация
Фёдор_Сумкин
фишка в том что в норм варианте подаётся энное количество управ воздействий..причом первое всегда равно нулю а последующие нормальные...проблема пропадает опять в отладчике(
на опрос подаётся канал..переменная которой присваиваетцо значение и вспомогательный массив...хз накуй он нужен...
 
2008-03-05 20:34:05 гильдия Столичные Шахтеры (Грандмастер)[47196] max_kvn Информация
У тя при задержке о высвечивает?
 
2008-03-05 20:42:34 гильдия Мудрецы (Грандмастер)[25914] гильдия Королевские Лабоходы (Адепт)[1898] Voide Информация
max_kvn
хз ваще есть ли задержка глючная штука..после вроде выводит
 
2008-03-05 20:51:47 гильдия Столичные Шахтеры (Мастер)[3723] гильдия Мудрецы (Мастер)[5097] Фёдор_Сумкин Информация
Voide
говоришь в отладчике все работает?
попробуй удалить экзешник, перезапусть и перекомпилируй - может и в этом трабла быть тоже:)
 
2008-03-05 21:03:39 гильдия Мудрецы (Грандмастер)[25914] гильдия Королевские Лабоходы (Адепт)[1898] Voide Информация
Фёдор_Сумкин
пробовал(
 
2008-03-05 21:17:01 гильдия Столичные Шахтеры (Мастер)[3723] гильдия Мудрецы (Мастер)[5097] Фёдор_Сумкин Информация
Voide
попробуй все У1 напечатать и посмотри
Writeln(Y1); внутрь функции засунь*
я б и сам потестил но нужен полный код, да и паскаль не установлен:)
 
2008-03-05 21:26:54 гильдия Мудрецы (Грандмастер)[25914] гильдия Королевские Лабоходы (Адепт)[1898] Voide Информация
Фёдор_Сумкин
у мну в конце проги таблица выводится..все нормальные значения кроме самого первого
 
2008-03-05 22:58:57 гильдия Мудрецы (Грандмастер)[25914] гильдия Королевские Лабоходы (Адепт)[1898] Voide Информация
 
2008-03-05 23:09:17 гильдия Бойцы (Ученик)[188] гильдия Столичные Кузнецы (Элита)[95569] Прарамист Информация
Voide
дай глянуть весь код
 
2008-03-05 23:14:16 гильдия Мудрецы (Грандмастер)[25914] гильдия Королевские Лабоходы (Адепт)[1898] Voide Информация



Program xxx;
Uses Crt,INTRFC;
Type ar=array[1..2000] of real;
Var T,H,M,i,N:integer;
a,y:ar;
C,D,Yn:REAL;
WSPOM:massiv;
Procedure Vvod(Var M,H:integer;T,Yn:real);
Begin
Writeln('Vvedite kanal upravleniy');
Readln(M);
Writeln('Vvedite kanal izmereniy');
Readln(H);
Writeln('Vvedite vremy takta upravleniy');
Readln(T);
Writeln('Vvedite kol-vo oprosa');
Readln(N);
Writeln('Vvedite nominalnoe znachenie otklika');
Readln(Yn);
end;
Procedure Rass(y:ar;Yn:real; Var c:real);
Begin
C:=0;
For i:=1 to N do
Begin
C:=C+(Y[i]-Yn)*(Y[i]-Yn);
end;
C:=C/N;
end;
Begin
ClrScr;
Vvod(M,H,T,Yn);
For i:=1 to N do
Begin
Writeln('Vvedite znachenie vozdeistviy');
Readln(A[i]);
UPRAV(M,A[i],WSPOM);
Delay(T);
Opros(H,Y[i],WSPOM);
Writeln(Y[i]:2:2);
end;
Rass(y,Yn,C);
For i:=1 to N do
Writeln('|',A[i]:5:5,' - ',Y[i]:5:5,'|');
Writeln('Ocenka kachestva upravleniy',' ',C:0:2);
Readln;
end.









UNIT Intrfc;
{‚ҐабЁп ¤«п BP}
INTERFACE
USES Dos;
TYPE
MASSIV = ARRAY[1..52] OF REAL;

PROCEDURE OPROS(KANAL:INTEGER; VAR XIZM:REAL; VAR WSPOM : MASSIV);
PROCEDURE UPRAV(KANAL:INTEGER; UPR :REAL; VAR WSPOM : MASSIV);

IMPLEMENTATION

PROCEDURE OPROS;
(* €¬Ёв в®а ®Ў"ҐЄв  Ёбб«Ґ¤®ў ­Ёп : KANAL - ­®¬Ґа Є ­ «  ®Їа®б ; *)
(* XIZM - १г«мв в Ё§¬ҐаҐ­Ёп Ї® Є ­ «г; WSPOM - ўбЇ®¬®Ј вҐ«м­л© *)
(* ¬ ббЁў вЁЇ  REAL б 52 н«Ґ¬Ґ­в ¬Ё. *)

var
i,j,j1,j2 : integer ;
t,jtim,r,r1,r2,r3,r4,delt,tau,dx : real;
h,m,s,s100 : word;


PROCEDURE GAUSS ( R,S : REAL; VAR R1:REAL);
(* ѓҐ­Ґа жЁп ЇбҐў¤®б«гз ©­ле ­®а¬ «м­ле зЁбҐ« *)

var
i:integer;
r2:real;

begin
r1:=0; for i:=1 to 12 do
begin
r2:=0.001* random(1000); r1:=r1+r2
end; r1:=(r1-6)*s+r
end; (* GAUSS *)

PROCEDURE IZMER7( J : INTEGER);
(* ѓҐ­Ґа жЁп ­Ґ§ ўЁбЁ¬ле ЇҐаҐ¬Ґ­­ле *)
var
r,rr : real;

begin

GetTime(h,m,s,s100); rr:=s; r:=m; rr:=rr+60*r; r:=h;
rr:=rr+3600*r;
writeln(h,m,s,s100);
wspom[11]:=rr; r:=0.001*random(1000);

if j=1 then wspom[1]:=-20+50*r else
if j=2 then wspom[2]:=740+30*r else
if j=3 then wspom[3]:=50+50*r else
if j=4 then
begin
wspom[4]:=0; if r>0.5 then wspom[4]:=1
end else
if j=5 then
begin
wspom[5]:=2; if r<=0.33333 then wspom[5]:=1 else
if r>=0.666667 then wspom[5]:=3
end else
if j=6 then
begin
wspom[6]:=0; if r>0.5 then wspom[6]:=1
end
end; (* IZMER7 *)

begin
(* Ќ з «® ®б­®ў­®© з бвЁ Їа®жҐ¤гал OPROS *)
{ randomize;}
if not (wspom[52]=77) then
begin
randomize; wspom[52]:=77;
end;
if kanal>=1 then
begin

if kanal <=10 then
begin
(* ЌҐ§ ўЁбЁ¬лҐ ЇҐаҐ¬Ґ­­лҐ *)
wspom[11]:=0; if kanal <= 6 then IZMER7(kanal);
r:=wspom[kanal]
end else if kanal <= 70 then
begin
r4:=0; r:=1; GAUSS(r4,r,r1); { writeln('gauss=',r1);}
if kanal <= 25 then
begin
(* ‹Ё­. ॣаҐбб. ¬®¤Ґ«м - Ї ббЁў­л© нЄбЇҐаЁ¬Ґ­в *)
j1:=kanal-11; j2:=kanal-18;
r:=30+j1*5-(5-j2*0.14)*wspom[1]+(0.6-j1*0.014)*wspom[2]+
(350-j1*10)*wspom[4]-(3-j2*0.07)*wspom[1]*wspom[4]+
(0.05+j1*0.001)*wspom[1]*wspom[3]+0.01*wspom[3]*wspom[3];
r1:=5*r1
end else if kanal <= 40 then
begin
(* ‹Ё­. ॣаҐбб. ¬®¤Ґ«м -  ЄвЁў­®-Ї ббЁў­л© нЄбЇҐаЁ¬Ґ­в *)
j1:=kanal-26; j2:=kanal-33;
r:=100+j1*20+(7+j1*0.5)*wspom[1]+(0.6+j2*0.01)*wspom[2]-
(15+j1*2)*wspom[5]+(4+j2*0.1)*wspom[7]+
(40+j1*2)*wspom[8]+(0.01+j2*0.0005)*wspom[1]*wspom[2]-
(0.5+j2*0.01)*wspom[7]*wspom[8]+(0.7-j1*0.02)*wspom[5]*
wspom[7]-(0.15-j1*0.01)*wspom[1]*wspom[1]+(30-j1*1.4)*
wspom[8]*wspom[8] ;
r1:=5*r1
end else if kanal <= 55 then
begin
(* ЌҐ«Ё­. ¬®¤Ґ«м - Ї ббЁў­л© нЄбЇҐаЁ¬Ґ­в *)
r:=30+(kanal-41)*3+(10+(kanal-48)*0.5)*exp((0.055-
(kanal-41)*0.001)*wspom[1])-(2+(kanal-50)*0.1)*
exp(0.07*wspom[1]-(0.0001+(kanal-46)*0.00002)*wspom[2]+
(1+(kanal-48)*0.06)*wspom[4]);
r1:=1.5*r1
end else if kanal <= 70 then
begin
(* ЌҐ«Ё­Ґ©­ п ¬®¤Ґ«м -  ЄвЁў­®-Ї ббЁў­л© нЄбЇҐаЁ¬Ґ­в *)
j1:=kanal-56; j2:=kanal-63;
r:=60+(kanal-65)*3+(-5.5+j1*0.1)*exp((0.05+j1*0.001)*
wspom[1]+(-0.1+j2*0.006)*wspom[9])+(9-j1*0.2)*
exp((-0.55+j1*0.01)*wspom[10]+(0.7+j2*0.03)*wspom[5]);
r1:=1.5*r1
end;
r:=r+r1;{ writeln('r=',r,' r1=',r1);}
end else if kanal <= 85 then
begin
(* „Ё­ ¬ЁзҐбЄ п ¬®¤Ґ«м - Ё­ҐажЁ®­­®Ґ §ўҐ­® *)
GetTime(h,m,s,s100); jtim:=s; r4:=m; jtim:=jtim+60*r4;
r4:=h; jtim:=jtim+3600*r4; tau:=15-(kanal-71)*0.4;
r:=0; r3:=0; for i:=20 downto 1 do
begin
r2:=jtim-wspom[i+12]; r2:=r2/tau;
if r2<=50 then r:=r+(wspom[i+32]-r3)*(1-exp(-r2));
r3:=wspom[i+32]
end; r:=(20+(kanal-78)*2)*r;

end else
begin
j1:=kanal-100; r1:=j1*0.1; r4:=1; GAUSS(r1,r4,r)
end
end ; xizm:=r; wspom[12]:=dx
end;

PROCEDURE UPRAV;
(* €¬Ёв жЁп Ї®¤ зЁ гЇа ў«. ў®§¤Ґ©бвўЁп ­  ®Ў'ҐЄв *)
type
mm = array[1..4] of real;

var
i,i1,j1 : integer;
t,jtim,r: real;
umin,umax : mm;
h,m,s,s100 : word;

begin
umin[1]:=-70; umax[1]:=-umin[1];
umin[2]:=-3; umax[2]:=-umin[2];
umin[3]:=-5; umax[3]:=-umin[3];
umin[4]:=-2.5;umax[4]:=-umin[4];
if ((kanal < 7) or (kanal > 10)) then
writeln(' Ћ&#152;€ЃЉЂ UPRAV : Є ­ « N',kanal:7,' гЇа.ў®§¤.=',upr:10:3)
else
begin
j1:=kanal-6; if upr>umax[j1] then upr:=umax[j1]
else if upr<umin[j1] then upr:=umin[j1];
wspom[kanal]:=upr;
if kanal=10 then if abs(wspom[33]-upr)>=0.01 then
begin
GetTime(h,m,s,s100); jtim:=s; r:=m; jtim:=jtim+60*r;
r:=h; jtim:=jtim+3600*r;
for i:=2 to 20 do
begin
i1:=22-i; wspom[i1+32]:=wspom[i1+31];
wspom[i1+12]:=wspom[i1+11]
end;
wspom[33]:=upr; wspom[13]:=jtim;

end
end
end;
END.