2008-03-05 20:03:46 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 Фёдор_Сумкин Voide я так понял У1 глобальная переменная? ты уверен что функция опрос присваивает ей посчитанное значение? и что возвращает эта функция непонятно, если значение У1, то попробуй присвоить Х1=Opros(H,Y1,WSPOM); Writeln(Х1); или она возвр. только массив WSPOM? имхо главная запарка с тем что у тебя глобальные переменные |
2008-03-05 20:24:13 Voide Фёдор_Сумкин фишка в том что в норм варианте подаётся энное количество управ воздействий..причом первое всегда равно нулю а последующие нормальные...проблема пропадает опять в отладчике( на опрос подаётся канал..переменная которой присваиваетцо значение и вспомогательный массив...хз накуй он нужен... |
2008-03-05 20:34:05 max_kvn У тя при задержке о высвечивает? |
2008-03-05 20:42:34 Voide max_kvn хз ваще есть ли задержка глючная штука..после вроде выводит |
2008-03-05 20:51:47 Фёдор_Сумкин Voide говоришь в отладчике все работает? попробуй удалить экзешник, перезапусть и перекомпилируй - может и в этом трабла быть тоже:) |
2008-03-05 21:03:39 Voide Фёдор_Сумкин пробовал( |
2008-03-05 21:17:01 Фёдор_Сумкин Voide попробуй все У1 напечатать и посмотри Writeln(Y1); внутрь функции засунь* я б и сам потестил но нужен полный код, да и паскаль не установлен:) |
2008-03-05 21:26:54 Voide Фёдор_Сумкин у мну в конце проги таблица выводится..все нормальные значения кроме самого первого |
2008-03-05 22:58:57 Voide |
2008-03-05 23:09:17 Прарамист Voide дай глянуть весь код |
2008-03-05 23:14:16 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(' Ћ˜€ЃЉЂ 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. |