Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Arrays auf ungleichheit Prüfen (https://www.delphipraxis.net/193307-arrays-auf-ungleichheit-pruefen.html)

Starworld1000 14. Jul 2017 10:43

Arrays auf ungleichheit Prüfen
 
Hallo zusammen,

ich bin gerade etwas am verzweifeln da ich momentan nicht weiterkomme. Vielleicht hab ich aber auch nur einen Knoten im Hirn :roll:

Folgendes Problem:
Ich entwickle gerade eine Schnittstelle für Maschinen, die Störzeiten und dessen Fehlermeldungen in Arrays schreiben soll. Aktuell nutze ich dafür 3 mehrdim. Arrays.

Fall1:
Tritt eine Störung auf, schreibe ich diese in das Stoer1 Array1. Mit einem Timer übertrage ich dann Stoer1 in das Stoer2 Array2 und prüfe auf Gleichheit (ob die Störung noch die gleiche ist oder behoben wurde). Bei Gleichheit passiert nichts und bei Ungleichheit wird eine weitere Störung in Stoer2 übertragen.

Fall2:
Ist die Störung behoben, wird Stoer1 leer aber Stoer2 noch voll. In dem Fall soll Stoer2 eine Endzeit bekommen und in StoerDB (Array3) übertragen werden.

Fall3:
Habe ich mehrere Störungen in Stoer1 stehen und eine beliebige Störung verschwindet nach ein paar Sekunden. Diese entfernte Störung soll dann ebenfalls in StoerDB (Array3) übertragen werden.


Mein Problem das momentan besteht. Der Fall1 habe ich ohne große Probleme umgesetzt und funktioniert auch soweit, jedoch komme ich an Fall2 oder Fall3 nicht weiter.
Ich Prüfe immer nur auf Ungleichheit oder Gleichheit zwischen Stoer1 und Stoer2 aber wenn Stoer1 leer ist oder neue Störungen hinzugefügt werden tritt immer Fall 1 ein und nie Fall2 oder 3.


Könnt ihr mir bitte weiterhelfen bevor ich noch ausflippe, oder würde es jemand komplett anders machen :-D

Code folgt noch wenn ich an dem anderen Rechner bin... 8-)

Viele Grüße
Starworld

stahli 14. Jul 2017 10:56

AW: Arrays auf ungleichheit Prüfen
 
Also ich kann Dein Problem so noch nicht nachvollziehen.

Versuch nochmal eine genauere Beschreibung.
Was genau willst Du wissen? Einen allgemeinen Lösungsansatz oder eine Lösung für ein Teilproblem?

Starworld1000 14. Jul 2017 11:04

AW: Arrays auf ungleichheit Prüfen
 
Hey danke für die schnelle Antwort :)

Ich wollte alle behobenen Störungen Protokolieren damit man sie später Auswerten kann.
Leider habe ich es bisher immer nur geschafft das Fall1 zutrifft aber nie Fall2 oder Fall3.

Es kommt eine oder mehrere Störungen in Stoer1 die dann in Stoer2 zum vergleichen übertragen werden. Jedoch komme ich nicht weiter wenn eine Störung behoben wurde diese in das finale StoerDB wegzuschreiben, da ja immer Fall1 zutrifft :oops:

Ein allgemeiner Lösungsansatz wäre nicht verkehrt :D

Hast du eine Idee?

Klaus01 14. Jul 2017 11:06

AW: Arrays auf ungleichheit Prüfen
 
.. musst Du 3 Array benutzen?

Könntest Du nicht mit einer Stoerung-Klasse arbeiten.
Diese kann neben den Daten zur Störung auch die Stati beinhalten.

Dann wäre das nur noch ein Array (ObjctList) und du müsstest nur noch die Stati vergleichen.

Grüße
Klaus

Der schöne Günther 14. Jul 2017 11:08

AW: Arrays auf ungleichheit Prüfen
 
Genau so etwas habe ich auch, damit ich deine Bezeichner richtig verstehe:
  • Stör1: Neu festgestellte Störungen
  • Stör2: Alle akut anstehenden Störungen
  • StörDB: Langzeit-Archivierung für alle aufgetretenen Störungen

Bei dir taucht im Konzept nicht auf dass man Störungen explizit "zur Kenntnis nehmen" kann und man später auch sieht ob man die Störung überhaupt mitbekommen hat oder sie nur kurz da war und dann wieder verschwand?

Wenn ja, folgende Fragen:
  • Stör1 ist doch nur temporär für einen Durchlauf. Egal ob deine Gleichheit-Prüfung (nach welchen Kriterien auch immer) zutrifft oder nicht, müsste man die Störung nach den Tests nicht aus "Stör1" entfernen? Diese Liste ist doch sonst zu nichts mehr gut
  • Wo ist das Problem bei Fall 2? Wenn du weißt dass "Störung 42" jetzt nicht mehr auftritt gehst du deine Liste "Stör2" durch. Gefunden? Nimm den Eintrag, setze das End-Datum, entferne ihn aus "Stör2" und übertrage ihn in "StörDB"


Anbei: Tu dir den Gefallen und geh bei einem Management dass Elemente zwischen Containern überträgt von Arrays weg. Nimm einen halbwegs intelligenten Container wie eine Liste oder ein Dictionary dass anhand der ID deiner Störung dir schon ein passendes Element gibt. Das ganze Hin-und-her-Iterieren über Arrays und Elemente entfernen (eventuelle Lücken schließen) bläht doch den Code extrem auf und ist stark fehleranfällig.

Starworld1000 14. Jul 2017 13:39

AW: Arrays auf ungleichheit Prüfen
 
zum veranschaulichen habe ich jetzt mal ein paar Codeschnipsel beigefügt.

Code:
...

Str2.Text:=(Copy(htmlcode,48,999));

...

SetLength(Stoer1, Str2.Count );

                for i := 0 to High(Stoer1) do
                        begin
                        Label6.Caption:=inttostr(i);
                        s:=Str2[i];
                        p1:=pos(':',s);            //Teilbereich1 Störzeit
                        SubStr := Copy(s,1, p1+6);
                        delete(s, 1, p1+6);

                        p1:=pos('/',s);            //Teilbereich2 Störbereich
                        SubStr2 := Copy(s,1, p1-1);
                        delete(s, 1, p1);

                        p1:=pos('/',s);            //Teilbereich3 Störmeldung
                        SubStr3 := Copy(s,1, p1-1);
                        delete(s, 1, p1);
         
         Stoer1[i, 0]:=Datetostr(now);
                        Stoer1[i, 1]:=Substr;
                        Stoer1[i, 2]:=Substr2;
                        Stoer1[i, 3]:=Substr3;
         end;

...

setlength(Stoer2,length(Stoer1));
for i:=0 to High(Stoer1) do
        begin
        If (Stoer2[i, 1] <> Stoer1[i,1]) or (Stoer2[i, 4] <> Stoer1[i,4]) then
                begin
                 Stoer2[i, 0]:=Stoer1[i, 0];
                 Stoer2[i, 1]:=Stoer1[i, 1];
                 Stoer2[i, 2]:=Stoer1[i, 2];
                 Stoer2[i, 3]:=Stoer1[i, 3];
...

                 end;
          end;
...
Richtig :) Stoer1 ist immer nur temporär solange eine Störung da ist oder nicht

Ich bin mir halt nicht sicher ob das überhaupt der richtige weg ist oder nicht ?
Ich muss halt mit dem String in STR2 arbeiten.

Der sieht wie folgt aus:
13:39:47/005/049/Störung Modul 02B ist ausgefallen
Ist die Störung behoben sollte sie so ungefähr in StoerDB stehen:
13.07.2017 | 13:39:47 | 005 | 049 | Störung Modul 02B ist ausgefallen | 13.07.2017 | 16:09:21

Nur irgendwie komme ich nicht mehr weiter :oops:

himitsu 14. Jul 2017 14:09

AW: Arrays auf ungleichheit Prüfen
 
Pssst, in den ganz neuen Delphis gibt es jetzt String-Like-Array-Operatoren.

Also nicht nur
Delphi-Quellcode:
arr := arr1 + arr2;
,
Delphi-Quellcode:
arr := arr1 + [xyz];
oder
Delphi-Quellcode:
arr := arr1 - arr2;

sondern auch Operatoren zum Vergleichen oder filtern, so ala
Delphi-Quellcode:
arr := arr1 * arr2;
arr := arr1 = arr2;
arr := arr1 <> arr2;
arr := arr1 > arr2;
arr := arr1 in arr2;
arr := xyz in arr2;

Glados 14. Jul 2017 14:12

AW: Arrays auf ungleichheit Prüfen
 
Zitat:

Pssst, in den ganz neuen Delphis gibt es jetzt String-Like-Array-Operatoren.
Der Vollständigkeit halber: wie sind denn die Namen :P

Zacherl 14. Jul 2017 14:13

AW: Arrays auf ungleichheit Prüfen
 
Zitat:

Zitat von Glados (Beitrag 1376731)
Zitat:

Pssst, in den ganz neuen Delphis gibt es jetzt String-Like-Array-Operatoren.
Der Vollständigkeit halber: wie sind denn die Namen :P

:?::?::?:

Zitat:

Zitat von himitsu (Beitrag 1376730)
Also nicht nur
Delphi-Quellcode:
arr := arr1 + arr2;
,
Delphi-Quellcode:
arr := arr1 + [xyz];
oder
Delphi-Quellcode:
arr := arr1 - arr2;

sondern auch Operatoren zum Vergleichen oder filtern, so ala
Delphi-Quellcode:
arr := arr1 * arr2;
arr := arr1 = arr2;
arr := arr1 <> arr2;
arr := arr1 > arr2;
arr := arr1 in arr2;
arr := xyz in arr2;


Glados 14. Jul 2017 14:14

AW: Arrays auf ungleichheit Prüfen
 
Ich glaube ich habe mich verlesen. Ich dachte hier eher an eine Funktion, der man Parameter übergibt und die Boolean zurückgibt.

Zacherl 14. Jul 2017 14:15

AW: Arrays auf ungleichheit Prüfen
 
Zitat:

Zitat von Glados (Beitrag 1376734)
Ich glaube ich habe mich verlesen. Ich dachte hier eher an eine Funktion, der man Parameter übergibt und die Boolean zurückgibt.

So ist es im Grunde auch, nur dass die Funktion als Operator implementiert wurde. Ist halt einfacher/schöner zu verwenden.

Glados 14. Jul 2017 14:42

AW: Arrays auf ungleichheit Prüfen
 
Bin ich wirklich so doof? :shock:

Delphi-Quellcode:
var
 aA: TArray<string>;
 aB: TArray<string>;
 b: Boolean;
begin
 aA := TArray<string>.Create('1', '2', '3');
 aB := TArray<string>.Create('1', 'B', '3', '4');

 b := '1' in aB;
end;

himitsu 14. Jul 2017 15:19

AW: Arrays auf ungleichheit Prüfen
 
Hab's noch nicht selber vollumfänglich ausprobiert ... nur ab und an die Werbetexte und Beispiele in verschiedenen Blogs gesehn.


Ich glaub in 10.2 wurde nochmal was gemacht,
aber in 10.1 fing es damit an.
http://docwiki.embarcadero.com/RADSt...Dynamic_Arrays

String-Like, wobei man es vielleicht besser mit Enum/Set vergleichen könnte, als mit Strings.

p80286 14. Jul 2017 21:40

AW: Arrays auf ungleichheit Prüfen
 
Mich würde zunächst einmal interessieren wie die Stör(begin)-Meldung und die Stör(end)-Meldung aussieht.Und wie die entsprechenden Meldungen herein kommen. dementsprechend kann dann die weitere Verarbeitung erfolgen.

Gruß
K-H

P.S.
Auch ich halte ein Array zunächst einmal nicht für die optimale Wahl.

Gruß
K-H

stahli 14. Jul 2017 22:04

AW: Arrays auf ungleichheit Prüfen
 
Mal noch ein Versuch, einen geordneten Einstieg zu finden...

Du solltest m.E. mit Klassen arbeiten:

Delphi-Quellcode:
TStoerungStatus = (ssNeu, ssBearbeitung, ssErledigt);

TStoerung = class
  Zeit: TDateTime;
  Bereich: String;
  Meldung: String;
  Status: TStoerungStatus;
end;
Dann hast Du pro Störung ein Objekt. Dieses kannst Du in Listen speichern, verschieben, weitergeben und löschen.

Deine Störungen bekommst Du als HTML-Seite und parst daraus die relevanten Daten. Richtig?
Wie viele solche Meldungen kommen davon in welcher Zeit rein?

Für jeden geparste Störung erzeugst Du ein StörungsObjekt und prüfst, ob dieses schon in der Störungsliste steht.

Hier ist mir unklar, ob die Störungen ggf. mehrfach gemeldet werden und wie Du eigentlich erkennen willst, ob die Störung schon gemeldet wurde.
Eigentlich sollte hier möglichst eine eindeutige ID existieren, damit man die Störungen zuverlässig vergleichen kann.

Wenn sehr viele schnelle Störungen reinkommen sollten, sollte man die Liste sortieren (z.B. eine binäre Suche verwenden), damit die Vergleiche schnell erfolgen können.

Also wenn eine neue Störung reinkommt, erhält sie den Status ssNeu und wird in die Liste gespeichert.

Jetzt können alle neuen Störungen nacheinander bearbeitet werden und erhalten den Status ssBearbeitung.

Wenn diese dann erledigt sind erhalten sie den Status ssErledigt.

Erledigte Störungen können dann in die Datenbank gespeichert und aus der Liste gelöscht werden.


Eine Alternative zu dieser Statuslösung wäre die Verwendung von 3 Listen (Eingang, Bearbeitung, Erledigt) und die Objekte dann von einer in die nächste Liste zu schieben.

Da ich Deinen Ablauf immer noch nicht verstanden habe, ist das vielleicht mal ein kleiner Vorschlag, um sich der Sache anzunähern.

mensch72 15. Jul 2017 10:29

AW: Arrays auf ungleichheit Prüfen
 
Mein Ansatz wäre im Prinzip ähnlich dem von Stahli gerade vorgeschlagenem, das mit getrennten Dictionarys zu lösen... und ganz wichtig: eine eigene CompareFunktion, weil man so einfach selbst bestimmt was wie verglichen werden soll... das ist zu 99% viel passender wie ein "zwangsweise 100% binary egual" ArrayVergleich per Operator durch den Compiler

- also alles zunächst wie gewollt im erste "LiveDictionary" zufügen bzw. aktualisieren
- dann z.B. im Timer alles(per "for each") aus dem "LiveDictionary" im ersten "LiveDictionary" auf Vorhandensein prüfen und wenn ja aktualisieren bzw. sonst zufügen und passendes auslösen
- usw...

Das mit dummen Arrays zu machen ist uneffektiv. Dictionarys mit dummen Records wären da sicher schonmal etwas besser und eleganter. Wenn es "schön" werden soll, das das Ganze mit/in eigener Storage-Klasse kapseln und dort auch die zugehörigen internen Comparer mit unterbringen... Mr. Rabe würde gleich noch ein ZugriffsInterface und ein SpeicherInterface designen, dann wird es sogar nebenbei universell erweiterbar/austauschbar.

Auch bei QuickAndDirty würde ich bei uns mindestens ne Kombi aus einer eineindeutigen "globalen/gesamt" TObjectList(oder "=" DB-Tabelle) UND separaten Dictionarys[HASH->"ol"INDEX](oder "=" DB-Zuordnungstabellen) für deine verschiedenen (Zeit)Kategorien und/oder States aller Störungen realsieren und das in einer eindeutig benannten Klasse(hier z.B. "Störungen") kapseln.

Dies entspricht der Tatsache, das dein Problem bei uns unter dem allgemeinem Sichwort "JobList" liefe und per "DesignRule" nach diesem allgemeingültigen internem Grundkonzept gelöst werden würde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz