[strukturierte Liste] - CompareListElement

Für allgemeine Fragen zur Programmierung mit PureBasic.
es_91
Beiträge: 411
Registriert: 25.01.2011 04:48

[strukturierte Liste] - CompareListElement

Beitrag 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?
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: [strukturierte Liste] - CompareListElement

Beitrag von alter Mann »

such mal in der Hilfe unter CompareMemory
Win11 64Bit / PB 6.0
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: [strukturierte Liste] - CompareListElement

Beitrag 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.
es_91
Beiträge: 411
Registriert: 25.01.2011 04:48

Re: [strukturierte Liste] - CompareListElement

Beitrag 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())
:(
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: [strukturierte Liste] - CompareListElement

Beitrag 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.
es_91
Beiträge: 411
Registriert: 25.01.2011 04:48

Re: [strukturierte Liste] - CompareListElement

Beitrag 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())
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [strukturierte Liste] - CompareListElement

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: [strukturierte Liste] - CompareListElement

Beitrag 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. ;-)
Antworten