public void MakeError_u(IReadMean[] par)
 {
     ScalarRes.CopyValueFrom(par[0]);
     if (par.Length != 4 || par[3].Boolean)
     {
         ScalarRes.Error = null;
     }
     ScalarRes.AddError(new MomErr(par[2].String, par[1].Integer));
     PutErr(par[2].String, par[1].Integer);
 }
        public void Max_uu(IReadMean[] par)
        {
            IReadMean mv = par[0];

            for (int i = 1; i < par.Length; ++i)
            {
                if (mv.ValueLess(par[i]))
                {
                    mv = par[i];
                }
            }
            ScalarRes.CopyValueFrom(mv);
        }
예제 #3
0
        //Вычисление скалярной функции для списков мгновенных значений
        internal IReadMean CalcScalar(DataType dataType,                   //Возвращаемый тип данных
                                      IReadMean[] par,                     //Список аргументов
                                      bool isComplex,                      //При вычислении используются флаги значений аргументов
                                      Action <IReadMean[], bool[]> action) //Действие, выполняющее вычисление для одного момента времени
        {
            SetScalarDataType(dataType);
            var mpar = new IReadMean[par.Length];
            var cpar = new bool[par.Length];

            bool isMom = !isComplex;

            for (int i = 0; i < par.Length; i++)
            {
                var mean = par[i] as Mean;
                if (mean != null)
                {
                    mpar[i] = mean;
                }
                else
                {
                    isMom = false;
                    if (par[i].Count == 0 && !isComplex)
                    {
                        return(MFactory.NewList(dataType));
                    }
                }
            }

            if (isMom) //Одно значение
            {
                DateTime t = Static.MinDate;
                foreach (var mean in mpar)
                {
                    if (mean.Time > t)
                    {
                        t = mean.Time;
                    }
                }
                if (t == Static.MinDate)
                {
                    t = PeriodBegin;
                }
                CalcScalarFun(mpar, () => action(mpar, cpar));
                return(ScalarRes.ToMom(t));
            }

            //Список значений
            var rlist = MFactory.NewList(dataType);

            while (true)
            {
                DateTime ctime = Static.MaxDate;
                foreach (var list in par)
                {
                    if (list.NextTime < ctime)
                    {
                        ctime = list.NextTime;
                    }
                }
                if (ctime == Static.MaxDate)
                {
                    break;
                }

                for (int i = 0; i < par.Length; i++)
                {
                    var list = par[i];
                    cpar[i] = list.NextTime == ctime;
                    if (cpar[i])
                    {
                        list.CurNum++;
                    }
                    mpar[i] = list.ToMean();
                }
                CalcScalarFun(mpar, () => action(mpar, cpar));
                rlist.AddMom(ScalarRes.ToMom(ctime));
            }
            return(rlist);
        }
 public void RemoveError_u(IReadMean[] par)
 {
     ScalarRes.CopyValueFrom(par[0]);
 }