Seite 1 von 1

Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Sa, 10. Nov 2007 19:34
von Manfred
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

Re: Vergleich 2er Arrays

Verfasst: Sa, 10. Nov 2007 23:00
von brandelh
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)

Verfasst: So, 11. Nov 2007 8:49
von Manfred
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:

Verfasst: So, 11. Nov 2007 9:22
von Manfred
Wie ich es vermutet hatte,

es lag daran. Tja, die Erfahrung zeigt, Pausen müssen ab und an sein.....

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Fr, 11. Mai 2018 12:23
von DelUser01
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.

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Fr, 11. Mai 2018 12:40
von Tom
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.

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Fr, 11. Mai 2018 13:24
von DelUser01
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.

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Fr, 11. Mai 2018 13:39
von Tom
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.

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Fr, 11. Mai 2018 14:15
von DelUser01
@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...

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Fr, 11. Mai 2018 15:50
von Werner_Bayern
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.

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Fr, 11. Mai 2018 16:04
von DelUser01
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).

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Fr, 11. Mai 2018 16:44
von Werner_Bayern
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:

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Fr, 11. Mai 2018 16:47
von Tom
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

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Fr, 11. Mai 2018 16:51
von DelUser01
@Werner

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

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Fr, 11. Mai 2018 21:08
von AUGE_OHR
@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 :?:

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Fr, 11. Mai 2018 21:52
von DelUser01
Hallo Jimmy

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

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Fr, 18. Mai 2018 10:23
von DelUser01
@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 :-)

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Di, 22. Mai 2018 12:32
von Werner_Bayern
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()

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Di, 22. Mai 2018 12:50
von Tom
Siehste mal. Allerdings habe ich sie leicht abgewandelt. Danke fürs Suchen und Finden!

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Di, 22. Mai 2018 14:30
von Werner_Bayern
Bitte. Zufall.

Re: Vergleich 2er Arrays [ERLEDIGT]

Verfasst: Di, 22. Mai 2018 18:09
von DelUser01
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] ) )