Seite 1 von 1

[strukturierte Liste] - CompareListElement

Verfasst: 15.02.2014 12:14
von es_91
Hi.

Kann man eine strukturierte Liste mit einer anderen vergleichen, und zwar elementweise, ohne jede Eigenschaft (/jedes Objekt) der einen mit der anderen vergleichen zu müssen?

Vielleicht so?

Achtung! Pseudocode.

Code: Alles auswählen

If PeekSTRUKTUR(Liste1()) = PeekSTRUKTUR(Liste2())
Oder so?

Code: Alles auswählen

For x = 1 To SIZEOF(Listenstruktur)
  If Not PeekB(Liste1()+x) = PeekB(Liste2()+x)
    Unterschied = #True
  EndIf
Next
Wie könnte es gehen?

Re: [strukturierte Liste] - CompareListElement

Verfasst: 15.02.2014 13:09
von alter Mann
such mal in der Hilfe unter CompareMemory

Re: [strukturierte Liste] - CompareListElement

Verfasst: 15.02.2014 13:13
von NicTheQuick
CompareMemory funktioniert aber nicht korrekt, wenn Listen, dynamische Arrays, Maps odet dynamische Strings in der Struktur enthalten sind. Da muss man dann händisch ran.

Re: [strukturierte Liste] - CompareListElement

Verfasst: 15.02.2014 13:47
von es_91
ähm ... ist das kompliziert? Sollte ich vielleicht doch jedes Objekt einzeln vergleichen?

So, wie ich es mir gedacht hatte, geht es leider nicht:

Code: Alles auswählen

Structure TEST
  a.l
  b$
EndStructure

Procedure CompareLists(List Liste1.TEST(), List Liste2.TEST())
  Define Kongruenz, x
  
  Kongruenz = #True
  
  For x = 0 To SizeOf(TEST) - 1
    If Not PeekB(Liste1()+x) = PeekB(Liste2()+x)
      Kongruenz = #False
      Break
    EndIf
  Next
  ProcedureReturn Kongruenz
EndProcedure

NewList TestListe1.TEST()
NewList TestListe2.TEST()

AddElement(Testliste1())
Testliste1()\a = 10
Testliste1()\b$ = "10"

AddElement(Testliste2())
Testliste2()\a = 10
Testliste2()\b$ = "10"

Debug CompareLists(Testliste1(), Testliste2())
:(

Re: [strukturierte Liste] - CompareListElement

Verfasst: 15.02.2014 13:55
von matbal
Wie schon gesagt wurde, Strings sind dynamische Variablen. In der Struktur wird bei den Strings nur die Adresse gespeichert, wo die Daten im Arbeitsspeicher abgelegt wurden. Diese Adressen sind natürlich unterschiedlich, da ja die Strings auch an unterschiedlichen Stellen im Speicher liegen.

Re: [strukturierte Liste] - CompareListElement

Verfasst: 15.02.2014 14:05
von es_91
Also führt kein Weg an einem objektweisen Vergleich vorbei? Immerhin gut zu wissen, dass es ohne Strings, Listen, etc. funktioniert.

Code: Alles auswählen

Structure TEST
  a.l
EndStructure

Procedure CompareLists(List Liste1.TEST(), List Liste2.TEST())
  Define Kongruenz, x
 
  Kongruenz = #True
 
  For x = 0 To SizeOf(TEST) - 1
    If Not PeekB(Liste1()+x) = PeekB(Liste2()+x)
      Kongruenz = #False
      Break
    EndIf
  Next
  ProcedureReturn Kongruenz
EndProcedure

NewList TestListe1.TEST()
NewList TestListe2.TEST()

AddElement(Testliste1())
Testliste1()\a = 10

AddElement(Testliste2())
Testliste2()\a = 10

Debug CompareLists(Testliste1(), Testliste2())

Re: [strukturierte Liste] - CompareListElement

Verfasst: 15.02.2014 14:36
von STARGÅTE
es_91 hat geschrieben:Also führt kein Weg an einem objektweisen Vergleich vorbei?
Richtig.

Also optinale Möglichkeit gibt es ja immer noch statische Arrays und fix-Strings, die du benutzen kannst, dann kannst du auch compare memory nutzen, ansonsten muss du wirklich jedes einzelne dynamische Objekt einzeln vergleichen.

Re: [strukturierte Liste] - CompareListElement

Verfasst: 15.02.2014 15:21
von NicTheQuick
Im Übrigen macht deine CompareLists-Procedure bisher auch nichts anderes als CompareMemory. Und wahrscheinlich wäre CompareMemory auch noch schneller als deine Version, weil da nicht herum gepeeked wird. ;-)