需求很复杂,我要从PLC采集数据,同时需要对采集的数据进行简单的平均值处理。那么我想做一个结构体,包含:
单元名称:string
单元值:integer
单元的作用:string
采集的数据:array of integer//这里最好是动态数组,便于控制要采集的平均值个数
平均值:float而且这样的结构体,还是很多个,(要采集很多个单元),我想把它放在一个 结构体 数组中。
那么高手们能不能给一个函数给我,实现这样的功能:每次采集 我就通过已知的: 单元名称 单元值 单元的作用 采集的一个数据(这个数据要放在动态数组中),放在指定的结构体中。函数完成平均值,采集数据的队列 处理。第二个函数:通过已知的 :单元名称 单元值 读出对应结构体中的 平均值。说明:
结构体的个数 也是动态的。谢谢
单元名称:string
单元值:integer
单元的作用:string
采集的数据:array of integer//这里最好是动态数组,便于控制要采集的平均值个数
平均值:float而且这样的结构体,还是很多个,(要采集很多个单元),我想把它放在一个 结构体 数组中。
那么高手们能不能给一个函数给我,实现这样的功能:每次采集 我就通过已知的: 单元名称 单元值 单元的作用 采集的一个数据(这个数据要放在动态数组中),放在指定的结构体中。函数完成平均值,采集数据的队列 处理。第二个函数:通过已知的 :单元名称 单元值 读出对应结构体中的 平均值。说明:
结构体的个数 也是动态的。谢谢
Trec=record
fname:string;
fvalue:integer;
fusage:string;
fdata:array of integer;
fav:double;
end;var
recarr:array of Trec;
函数,遍历recarr,找到fname一样的,取其中的fav
2 怎么通过 fname,fvalue 找到对应的 结构体,如果结构体不存在,就新建
(给一个简单函数,学一下)
谢谢
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;
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;
先定义结构体,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);
...
然后对每个单元进行重写。然后是对这些对象的管理,如果对象数量不是很多 直接用TList来管理。如果对象庞大 就用hashtable来管理。从你的描述来看,是做通信类的东西。线用面向对象的方法 构架好程序框架。剩下的就是体力活了
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;
定义
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;