unit mean; interface uses GLType,Mathobj,GLProc,Classes,SysUtils, MVTU_TLB; type TMeanState=record Sum,REZ:TExtArray; N:double; end; PMeanState=^TMeanState; //Свойства среднего TMeanProp=record Size:^integer; //Размер серии OutMode:^integer; //1 - вывод по сериям ,0 - вывод по всей выборке Tau:^double; //Период квантования end; PMeanProp=^TMeanProp; //Вычисление среднего значения. function TStatMean(at,adt:RealType;var time,dtime:RealType;var AU,AY:TPtrExt;var AX,ADX:array of RealType; var CU,CY : TIntArray;var Prop:TPtrArray;var Vars:PMeanState;Action:Integer):Integer;export; function TStatMeanRst(at,adt:RealType;var AU,AY:TPtrExt;var AX,ADX:PExtArr; var Prop:TPtrArray;var Vars : PMeanState;Action:Integer;var F:File):Integer;export; implementation function TStatMeanConvert(Action: integer; Vars: Pointer; Prop: TPtrArray; PropStr: TStringList; BlockId: integer; var MVTU: IMVTU_Server):integer; const RecName:PChar = 'Среднее арифметическое'; var Res: integer; begin case Action of //Возвращаем ссылку на имя записи в базе МВТУ-4 cnv_GetRecName: Result:=integer(RecName); //Конвертируем и устанавливаем параметры при помощи интерфейса МВТУ cnv_Convert: with PMeanProp(Prop.Arr)^ do try //Присваиваем параметры для блока MVTU.SetBlockProp(BlockId,'size',PChar(PropStr[0]),Res); MVTU.SetBlockProp(BlockId,'outmode',PChar(IntToStr(OutMode^)),Res); MVTU.SetBlockProp(BlockId,'tau',PChar(PropStr[2]),Res); finally end; end; end; function TStatMean; var i:integer; begin Result:=0; with Vars^,PMeanProp(Prop.Arr)^ do case Action of f_GetConvertFuncAdr: Result:=integer(@TStatMeanConvert); f_GetCount : CY.arr^[0]:=CU.arr^[0]; f_InitMem : begin Sum.ChangeCount(CU.arr^[0]); REZ.ChangeCount(CU.arr^[0]); end; f_InitState : begin N:=1; Move(AU.Ptr(0).arr^,Sum.arr^,AU.Ptr(0).Count*SOfR); Move(AU.Ptr(0).arr^,AY.Ptr(0).arr^,AU.Ptr(0).Count*SOfR) end; f_InitTime : time:=at+Tau^; f_Create : begin Vars:=New(PMeanState); with PMeanState(Vars)^ do begin Sum:=TExtArray.Create(1); REZ:=TExtArray.Create(1); end end; f_Free : begin Sum.Free; REZ.Free; Dispose(Vars) end; f_RestoreOuts: Move(REZ.arr^,AY.Ptr(0).arr^,REZ.Count*SOfR); f_GoodStep : if time-at<=adt/2 then begin N:=N+1; for i:=0 to AU.Ptr(0).Count-1 do Sum.arr^[i]:=Sum.arr^[i]+AU.Ptr(0).arr^[i]; if (OutMode^<>1) or (N=Size^) then begin for i:=0 to AU.Ptr(0).Count-1 do AY.Ptr(0).arr^[i]:=Sum.arr^[i]/N; Move(AY.Ptr(0).arr^,REZ.arr^,REZ.Count*SOfR); end; if (N=Size^) and (OutMode^=1) then begin N:=0; Sum.FillArray(0); end; time:=time+Tau^; end end end; function TStatMeanRst; begin Result:=0; with PMeanProp(Prop.arr)^,Vars^ do case Action of f_ReadRez : try BlockRead(F,REZ.arr^,REZ.Count*SOfR); except Result:=er_ReadFile end; f_WriteRez : try BlockWrite(F,REZ.arr^,REZ.Count*SOfR); except Result:=er_WriteFile end; f_ReadRst : try BlockRead(F,N,SOfR); BlockRead(F,sum.arr^,Sum.Count*SOfR); BlockRead(F,REZ.arr^,REZ.Count*SOfR); except Result:=er_ReadFile end; f_WriteRst : try BlockWrite(F,N,SOfR); BlockWrite(F,sum.arr^,sum.Count*SOfR); BlockWrite(F,REZ.arr^,REZ.Count*SOfR); except Result:=er_WriteFile end; end end; end.