summaryrefslogtreecommitdiff
path: root/fhunit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'fhunit.pas')
-rw-r--r--fhunit.pas74
1 files changed, 68 insertions, 6 deletions
diff --git a/fhunit.pas b/fhunit.pas
index 66ba1f6..66fc40f 100644
--- a/fhunit.pas
+++ b/fhunit.pas
@@ -29,6 +29,7 @@ type
public
constructor create;
destructor destroy; override;
+ function merge(mP: tMessPunkt): integer;
function lade(s: string): boolean;
function schreibe: string;
property zeit: extended
@@ -55,6 +56,7 @@ type
property items[i: longint]: tMessPunkt
read rItem; default;
function hat(zeit: extended): boolean;
+ function hatNichtNull(zeit: extended): boolean;
function minMaxY(startZeit,stopZeit: extended): tMessWerteExtPoints;
procedure dump(p: pointer);
procedure pmud(p: pointer; version,len: longint);
@@ -163,6 +165,40 @@ begin
result:=_mW[mG];
end;
+function tMessPunkt.merge(mP: tMessPunkt): integer;
+var
+ mG: tMessGroesze;
+begin
+ result:=0;
+ if not isNan(mP.zeit) then begin
+ if isNan(zeit) then begin
+ result:=1;
+ _uZeit:=mP.Zeit;
+ setzeZeit;
+ end else begin
+ if zeit <> mP.zeit then begin
+ writeln('Inkonsistenz: ' + schreibe + ' -> ' + mP.schreibe);
+ result:=-1;
+ exit;
+ end;
+ end;
+ end;
+ for mG:=low(tMessGroesze) to high(tMessGroesze) do begin
+ if isNan(mP.mW[mG]) then
+ continue;
+ if isNan(mW[mG]) then begin
+ result:=1;
+ _mW[mG]:=mP.mW[mG];
+ continue;
+ end;
+ if mW[mG] <> mP.mW[mG] then begin
+ writeln('Inkonsistenz: ' + schreibe + ' -> ' + mP.schreibe);
+ result:=-1;
+ exit;
+ end;
+ end;
+end;
+
function tMessPunkt.lade(s: string): boolean;
var
zG: tZeitGroesze;
@@ -322,8 +358,10 @@ begin
result:=true;
if (i>=count) or (items[i].zeit<>nm.zeit) then
inhalt.Insert(i,nm)
- else
+ else begin
+ items[i].merge(nm);
nm.free;
+ end;
end;
function tMessPunkteListe.append(s: string): boolean;
@@ -380,9 +418,25 @@ begin
result:= round((items[i].zeit - zeit) * 6 * 24) = 0;
end;
+function tMessPunkteListe.hatNichtNull(zeit: extended): boolean;
+var
+ i: longint;
+ mG: tMessGroesze;
+begin
+ result:=false;
+ i:=bisekt(zeit);
+ if (i<0) or (i>=count) then
+ exit;
+ for mG:=low(tMessGroesze) to high(tMessGroesze) do
+ if isNan(items[i].mW[mG]) then
+ exit;
+ result:= round((items[i].zeit - zeit) * 6 * 24) = 0;
+end;
+
function tMessPunkteListe.statistics: string;
var
- i,gaps,gap: longint;
+ i,gaps,gap,nans: longint;
+ mG: tMessGroesze;
begin
if count=0 then begin
result:='leer';
@@ -391,14 +445,22 @@ begin
result:='';
gaps:=0;
gap:=0;
- for i:=count-1 downto 1 do
+ nans:=0;
+ for i:=count-1 downto 1 do begin
if round((items[i].zeit - items[i-1].zeit) * 6 * 24) <> 1 then begin
inc(gaps);
gap:=gap + round((items[i].zeit - items[i-1].zeit) * 6 * 24 - 1);
result:=result + dateTimeToStr(items[i-1].zeit) + ' -> ' + dateTimeToStr(items[i].zeit) + #10;
end;
- result:=result + intToStr(count) + ' Werte von ' + dateTimeToStr(items[0].zeit) + ' bis ' + dateTimeToStr(items[count-1].zeit) + #10;
- result:=result + intToStr(gaps) + ' Lücken, ' + intToStr(gap) + ' Messwerte';
+ for mG:=low(tMessGroesze) to high(tMessGroesze) do
+ if isNan(items[i].mW[mG]) then
+ inc(nans);
+ end;
+ result:=result + intToStr(count) + ' Werte von ' + dateTimeToStr(items[0].zeit) + ' bis ' + dateTimeToStr(items[count-1].zeit);
+ if gaps>0 then
+ result:=result + #10 + intToStr(gaps) + ' Lücken, ' + intToStr(gap) + ' Messwerte';
+ if nans>0 then
+ result:=result + #10 + intToStr(nans) + ' NaNs';
end;
// tMessPunkteUpdateThread *****************************************************
@@ -448,7 +510,7 @@ end;
procedure tMessPunkteUpdateThread.nZeitDuplikateAuslassen;
begin
- while _besitzer.werte.hat(nZeit) do begin
+ while _besitzer.werte.hatNichtNull(nZeit) do begin
if beenden then exit;
nZeit:= nZeit + _tAnz * 1 / 24 / 6;
end;