From 0928e2cfd8b23bbb40574cfbabc7acb959e24c53 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Mon, 1 Aug 2022 09:35:22 +0200 Subject: nulls bekaempfen --- fhunit.pas | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----- wetter.lps | 77 +++++++++++++++++++++++++++++++------------------------------- 2 files changed, 107 insertions(+), 44 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; diff --git a/wetter.lps b/wetter.lps index 2575592..40e4f0e 100644 --- a/wetter.lps +++ b/wetter.lps @@ -9,7 +9,7 @@ - + @@ -19,9 +19,9 @@ - - - + + + @@ -29,16 +29,16 @@ - + - - - + + + @@ -47,7 +47,7 @@ - + @@ -150,122 +150,123 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + - + - + - + - + - + - + - + - + - + - + - + -- cgit v1.2.3-54-g00ecf