Vergleich 2er Arrays [ERLEDIGT]

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 18152
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Vergleich 2er Arrays [ERLEDIGT]

Beitrag von Manfred » Sa, 10. Nov 2007 19:34

Hi,

ich dachte erst, es ging auch so. Aber irgendwie klappt es mal wieder nicht. Wie kann ich 2 Arrays mit einander vergleichen? Ich habe in einem Array die Struktur einer DB und möchte diese mit der Struktur einer bestehenden vergleichen, ob sich etwas geändert hat. Ich habe es mit Var2Bin() ausporbiert, bei dem auch lt. Debugger das gleiche drinsteht, aber trotzdem bringt der Vergleich Unterschiede. Wo liegt mein Denkfehler?

Code: Alles auswählen

cArrayIst  := Var2Bin((::nArea)->(DbStruct()))
cArraySoll := Var2Bin(::aStruktur)

IF cArrayIst != cArraySoll (mit <> habe ich es auch schon ausprobiert)
    lErfolg := .F.
ENDIF
Zuletzt geändert von Manfred am Mi, 14. Apr 2010 20:18, insgesamt 1-mal geändert.
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14595
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Vergleich 2er Arrays

Beitrag von brandelh » Sa, 10. Nov 2007 23:00

Manfred hat geschrieben: Ich habe es mit Var2Bin() ausporbiert, bei dem auch lt. Debugger das gleiche drinsteht, aber trotzdem bringt der Vergleich Unterschiede. Wo liegt mein Denkfehler?
Versuche es mal so

Code: Alles auswählen

cArrayIst  := Var2Char((::nArea)->(DbStruct()))
cArraySoll := Var2Char(::aStruktur)

lErfolg := (cArrayIst == cArraySoll)
Gruß
Hubert

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 18152
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Beitrag von Manfred » So, 11. Nov 2007 8:49

Hi Hubert,

ich glaube ich muß den Drogenkonsum ein wenig mehr einschränken, oder wenigstens den Dealer wechseln. :roll:

Es war natürlich Var2Char(), was in meiner alten Version benutzt wurde. Ich habe im Handbuch nachgesehen und dort stand Var2bin(). Dann habe ich wohl irgendwie im Anfall eines Wahns diese Möglichkeit gewählt und dann nur noch das gesehen und war fest davon überzeugt es die ganze Zeit so gemacht zu haben.

Ich werde es natürlich jetzt genauso wie bisher mit Var2Char() probieren.


PS:Ich merke, in Gedanken bin ich schon seit Tagen in Berlin...... :lol:
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 18152
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Beitrag von Manfred » So, 11. Nov 2007 9:22

Wie ich es vermutet hatte,

es lag daran. Tja, die Erfahrung zeigt, Pausen müssen ab und an sein.....
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite

DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von DelUser01 » Fr, 11. Mai 2018 12:23

Hallo

gibt es inzwischen eine schnellere/direkte Möglichkeit Arrays zu vergleichen?
Große Arrays vor dem Vergleich mit Var2Char() zu konvertieren dauert ja auch seine Zeit.

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7333
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von Tom » Fr, 11. Mai 2018 12:40

Hallo, Roland.

Man kann Arrays nicht direkt vergleichen, weil Arrayvariablen nur Pointer sind. Der Vergleichsoperator sagt ja, wenn zwei Variablen(namen) auf dasselbe Array verweisen - und nein, wenn das nicht der Fall ist.

Der schönste Weg ist eine rekursive Vergleichsfunktion. Man vergleicht Element für Element. Wenn die Elemente selbst Arrays sind, ruft man die Vergleichsfunktion für die Sub-Arrays auf. Sobald irgendwas unterschiedlich ist (Datentyp oder Inhalt), retourniert die Funktion durch alle Stufen .F. und bricht ab. .T. kommt nur, wenn alle Stufen durchlaufen, ohne eine Ungleichheit zu entdecken. Die Funktion ist bei gleichen Arrays langsamer als bei ungleichen, aber schneller als ein Var2-Vergleich, würde ich behaupten.

Ich habe so eine Funktion, aber ich bin mir nicht sicher, ob ich die auch selbst geschrieben habe. Deshalb kann ich sie nicht posten.
Herzlich,
Tom

DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von DelUser01 » Fr, 11. Mai 2018 13:24

Hallo Tom

so einen schrittweisen Vergleich habe ich mir auch schon einmal ausgearbeitet. Läuft ja aber fast auf dasselbe wie Var2Char() hinaus und ist glaube ich nicht schneller. Di zu vergleichenden Arrays sind meistens gleich und damit wird der Vergleich immer vollständig durchlaufen. Das macht das recht langsam.

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7333
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von Tom » Fr, 11. Mai 2018 13:39

Hallo, Roland.

Wenn es um einen Sonderfall geht, bei dem sowieso nur selten Ausnahmen eintreten, wäre es vermutlich auch einfacher, nur diejenigen Stellen zu vergleichen, an denen auch Unterschiede auftreten können.

Die rekursive ArrayCompare-Funktion, die ich verwende, ist selbst bei multidimensionalen und mehrere tausend Einträge umfassenden Arrays sehr schnell.
Herzlich,
Tom

DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von DelUser01 » Fr, 11. Mai 2018 14:15

@Tom

Du hast recht - ich sollte mir Gedanken darüber machen welche Array-Einträge wirklich Änderungen unterworfen sein können und nur diese vergleichen.

Es handelt sich um einen Großteil meiner Menü-Steuerung und da kann sich theoretisch an den meisten Stellen etwas ändern...

Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1549
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von Werner_Bayern » Fr, 11. Mai 2018 15:50

Bei mir dauert ein var2char auf ein 83000zeiliges Array mit je 14 Dimensionen pro Subarray bei einer Gesamtgröße von 10,5 MB genau 1.14 Sekunden. Entweder Toms Vorschlag oder das Konzept überdenken?

Ich geh mal davon aus, dass Deine Menüstruktur wesentlich kleiner ist als mein Test. Var2char ist schnell, wenn Du das aber sehr oft in diesem Zusammenhang benötigst, wird es natürlich langsam.
es grüßt euch

Werner

DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von DelUser01 » Fr, 11. Mai 2018 16:04

Hallo Werner

die Anzahl der Vergleiche ist das Problem. Je nach Programmmodul und Benutzereinstellungen kann der Vergleich bei jedem Tastatur-/Maus-Event notwendig sein.

Der Array-Aufbau an dieser Stelle ist nur ein Teil des Geschwindigkeitsproblems. Danach kommt noch das Anzeigen der Buttons (Text+BMP).

Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1549
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von Werner_Bayern » Fr, 11. Mai 2018 16:44

DelUser01 hat geschrieben:
Fr, 11. Mai 2018 16:04
Je nach Programmmodul und Benutzereinstellungen kann der Vergleich bei jedem Tastatur-/Maus-Event notwendig sein.
Da hast Du Dich aber verschrieben? Nach jedem Maus-Event? :shock:
es grüßt euch

Werner

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7333
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von Tom » Fr, 11. Mai 2018 16:47

Ich habe testweise zwei jeweils 1000 x 1000 große Arrays erzeugt (was übrigens eine Zehntelsekunde dauerte) und die dann auf zwei Arten 100 mal verglichen, einmal mit Var2Char und Stringvergleich und einmal über eine rekursive Funktion. Bei Übereinstimmung sind beide Vergleichsmethoden ungefähr gleich schnell, aber der Stringvergleich ändert seine Geschwindigkeit nicht, wenn die Arrays ungleich sind. Die rekursive Funktion verändert ihr Verhalten entsprechend: Ein Fehler an [500,500], der also nach einem Viertel der Vergleichsoperationen gefunden wird, beschleunigt sie um den Faktor 3 bis 4.

Die Vergleichsfunktion ist aus den o.g. Gründen in diesem Code nicht enthalten:

Code: Alles auswählen

FUNCTION Main()
LOCAL a1 := {}, a2 := {}, nCtr, aSubArray := Array(1000), nSeconds := Seconds(), c1, c2

CLEAR

* Array 1000 x 1000 erzeugen
FOR nCtr := 1 to 1000
  aSubArray[nCtr] := nCtr
NEXT

FOR nCtr := 1 to 1000
  aAdd(a1,aClone(aSubArray))
  aAdd(a2,aClone(aSubArray))
NEXT

? Seconds()-nSeconds
nSeconds := Seconds()

* 100 Vergleiche mit V2C
FOR nCtr := 1 to 100
  c1 := Var2Char(a1)
  c2 := Var2Char(a2)
  IF c1 == c2

  ENDIF
NEXT

? Seconds()-nSeconds
nSeconds := Seconds()

* 100 Vergleiche mit ACompare (rekursiv)
FOR nCtr1 := 1 to 100
  IF aCompare(a1,a2)

  ENDIF
NEXT

? Seconds()-nSeconds
nSeconds := Seconds()

a1[500,500] := 759 // Fehler ungefähr in der Mitte, ein Viertel so viele Vergleichsoperationen

* 100 Vergleiche mit V2C
FOR nCtr := 1 to 100
  c1 := Var2Char(a1)
  c2 := Var2Char(a2)
  IF c1 == c2

  ENDIF
NEXT

? Seconds()-nSeconds
nSeconds := Seconds()

* 100 Vergleiche mit ACompare (rekursiv)
FOR nCtr1 := 1 to 100
  IF aCompare(a1,a2)

  ENDIF
NEXT

? Seconds()-nSeconds

RETURN nil
Herzlich,
Tom

DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von DelUser01 » Fr, 11. Mai 2018 16:51

@Werner

OK - zu grob beschrieben: die nicht relevanten Events werden herausfefiltert.
Wenn Mausklick und Scrolrad nicht durch Objekte abgehandelt ("verbraucht") wurden dann schon.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11515
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von AUGE_OHR » Fr, 11. Mai 2018 21:08

@Roland : du solltest dein Menu Anliegen noch mal als neuen Thread abtrennen wenn es um "noch mehr" geht ... vielleicht auch ein anderes Konzept :idea:

---

Frage : was macht ihr bei 2 x 1920x1024 Array (mit numerischen Werten) vergleichen wollt :?:
gruss by OHR
Jimmy

DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von DelUser01 » Fr, 11. Mai 2018 21:52

Hallo Jimmy

vermutlich hast Du recht - ich glaube inzwischen dass das mit dem Array-Vergleich für mein Problem nicht der richtige Weg ist....

DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von DelUser01 » Fr, 18. Mai 2018 10:23

@Tom
habe es doch nochmal mit dem Array-Vergleich probiert - jetzt geht es.
Zuerst mit der Var2Char()-Variante und dann mit einer eigenen Funktion. Habe aber die Geschwindigkeit (noch) nicht verglichen. Wenn Du willst schicke ich Dir den Code, kannst es dann mit Deiner Methode vergleichen :-)

Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1549
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von Werner_Bayern » Di, 22. Mai 2018 12:32

Tom hat geschrieben:
Fr, 11. Mai 2018 12:40
Ich habe so eine Funktion, aber ich bin mir nicht sicher, ob ich die auch selbst geschrieben habe. Deshalb kann ich sie nicht posten.
Hast Du nicht :wink:

Steht in der Hilfe als Beispiel bei Var2Bin()
es grüßt euch

Werner

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7333
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von Tom » Di, 22. Mai 2018 12:50

Siehste mal. Allerdings habe ich sie leicht abgewandelt. Danke fürs Suchen und Finden!
Herzlich,
Tom

Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1549
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von Werner_Bayern » Di, 22. Mai 2018 14:30

Bitte. Zufall.
es grüßt euch

Werner

DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von DelUser01 » Di, 22. Mai 2018 18:09

Hallo Werner
OK - da habe ich irgendwann also auch abgeschrieben :-)
funktionierte aber nur vollständig mit folgender Änderung:

aus
lEqual := (aArray1[nCount] == aArray2[nCount])
wird
lEqual := ( Var2Char( aArray1[nCount] ) == Var2Char( aArray2[nCount] ) )

Antworten