需求很复杂,我要从PLC采集数据,同时需要对采集的数据进行简单的平均值处理。那么我想做一个结构体,包含:
单元名称:string
单元值:integer
单元的作用:string
采集的数据:array of integer//这里最好是动态数组,便于控制要采集的平均值个数
平均值:float而且这样的结构体,还是很多个,(要采集很多个单元),我想把它放在一个 结构体 数组中。
那么高手们能不能给一个函数给我,实现这样的功能:每次采集 我就通过已知的:  单元名称  单元值  单元的作用 采集的一个数据(这个数据要放在动态数组中),放在指定的结构体中。函数完成平均值,采集数据的队列 处理。第二个函数:通过已知的 :单元名称  单元值  读出对应结构体中的 平均值。说明:
结构体的个数 也是动态的。谢谢

解决方案 »

  1.   

    如果不需要直接保存的
    Trec=record
      fname:string;
      fvalue:integer;
      fusage:string;
      fdata:array of integer;
      fav:double;
    end;var
      recarr:array of Trec;
    函数,遍历recarr,找到fname一样的,取其中的fav
      

  2.   

    1 结构体内的 动态数组 怎么 初始化?
    2 怎么通过   fname,fvalue  找到对应的 结构体,如果结构体不存在,就新建
    (给一个简单函数,学一下)
    谢谢
      

  3.   

    1、setlength(arr,n)
    2、
    for i:=0 to length(recarr)-1 do
      if recarr[i].fname=aname then
      begin
        result:=recarr[i].fav;
        exit;
      end;
      i:=length(recarr);
      setlength(recarr,i+1);
      result:=recarr[i].fav;
      

  4.   

    每新增一个 结构体,里面是fdata是动态的,需要setlength一下
      

  5.   

    賦值:setlength(recarr,10);
    for i:=low(recarr) to high(recarr) do
    begin
      recarr[i].fname:='A';
      recarr[i].fvalue:=i;
      recarr[i].fusage:='B';
      setlength(recarr[i].fdata,20);
      for j:=low(recarr[i].fdata) to high(recarr[i].fdata) do
        recarr[i].fdata[j]:=j;
      recarr[i].fav:=10.2;
    end;
      

  6.   

    很简单,方法也很多,
    先定义结构体,Trec=record
      fname:string;
      fvalue:integer;
      fusage:string;
      fdata:array of integer;
      fav:double;
    end;var
      recarr:array of Trec;也可以用TList;这样好操作点
    Prec = ^Trec
    Trec=record
      fname:string;
      fvalue:integer;
      fusage:string;
      fdata:array of integer;
      fav:double;
    end;var
      List: Tlist;
      tmpPrec: Prec; 
        
      //添加的时候这样
      GetMem(tmpPrec, SizeOf(Trec));
      tmpPrec^.fname := ...
      ...
      ...
      List.Add(tmpPrec);   //访问的时候这样
      ShowMessagePrec(List.Item[Index]).fname);
      ...
     
      

  7.   

    如你所说 应该是 一个单元用1个类来实现先定义一个基类,完成你数据采集所有的操作。预留你应用处理部分。
    然后对每个单元进行重写。然后是对这些对象的管理,如果对象数量不是很多 直接用TList来管理。如果对象庞大 就用hashtable来管理。从你的描述来看,是做通信类的东西。线用面向对象的方法 构架好程序框架。剩下的就是体力活了
      

  8.   

    当然你如果用2007以上的版本,用record代替类也可以  type
        TMYPLCRecord= record
        private
          FUnintName:string;
          FCode:Integer;
          FFunncMemo:string;
          FBuf:array of Integer;
          FAverage:Double;
        Fproperty: Integer;
        function GetBufsize: Integer;
        procedure SetBufsize(const Value: Integer);
        public
          property Average:Double read  FAverage;
          property UnintName:string read FUnintName write FUnintName;
          property Code:Integer read Fproperty write Fproperty;
          property FunncMemo :string read FFunncMemo write FFunncMemo;
          property BufSize :Integer read GetBufsize write SetBufsize;
          function Execute:Double;
        end;
    { TMYPLCRecord }function TMYPLCRecord.Execute: Double;
    begin
     // 计算 FAverage
      Result := FAverage;
    end;function TMYPLCRecord.GetBufsize: Integer;
    begin
        Result := Length(FBuf)
    end;procedure TMYPLCRecord.SetBufsize(const Value: Integer);
    begin
       SetLength(Fbuf,Value);
    end;
      

  9.   

    上面的代码完成了 你的第一个问题。如果你的平均值需要每次计算 就直接用Execute方法来返回,甚至不需要定义FAverage来存储。剩下的就是管理这些record了。
    定义
    PMYPLCRecord=^TMYPLCRecord;用Tlist来管理,如下:
      TPLCFuncList=class
      private
        Flist : TList;
        function Getcount: Integer;
        function GetItems(index: Integer): PMYPLCRecord;
      published
        public
          constructor Create;
          destructor Destroy; override;
          property  Count: Integer  read Getcount;
          property Items[index:Integer]:PMYPLCRecord read GetItems;
          function Add:  PMYPLCRecord;
          function FuncCodeOfItem(const Code:Integer):PMYPLCRecord;
          procedure Delete(const Index:Integer);
          procedure Clear;
        end;
    { TPLCFuncList }function TPLCFuncList.Add: PMYPLCRecord;
    begin
       New(Result);
       Flist.Add(Result)
    end;procedure TPLCFuncList.Clear;
    begin
      while Flist.Count>0 do
       Delete(0);
    end;constructor TPLCFuncList.Create;
    begin
        Flist := Tlist.Create;
    end;procedure TPLCFuncList.Delete(const Index: Integer);
    begin
       items[index].BufSize := 0;
       DisposeStr(flist.Items[index]);
       Flist.Delete(index);
    end;destructor TPLCFuncList.Destroy;
    begin
      Clear;
      Flist.Free;
      inherited;
    end;function TPLCFuncList.FuncCodeOfItem(const Code: Integer): PMYPLCRecord;
    var
      I:integer;
    begin
        Result := nil;
        for I := 0 to FList.Count - 1 do
        begin
            if items[i].Code = code then
            begin
              Result :=items[i];
              Break;
            end;
        end;
    end;function TPLCFuncList.Getcount: Integer;
    begin
        Result := Flist.Count;
    end;function TPLCFuncList.GetItems(index: Integer): PMYPLCRecord;
    begin
        Result := flist.Items[index];
    end;