Vergleich 2er Arrays [ERLEDIGT]

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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
Zuletzt geändert von Manfred am Mi, 14. Apr 2010 20:18, insgesamt 1-mal geändert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Vergleich 2er Arrays

Beitrag 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)
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag 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:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Wie ich es vermutet hatte,

es lag daran. Tja, die Erfahrung zeigt, Pausen müssen ab und an sein.....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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.
Herzlich,
Tom
DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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.
Herzlich,
Tom
DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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...
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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.
es grüßt

Werner

<when the music is over, turn off the lights!>
DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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).
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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:
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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
Herzlich,
Tom
DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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 :?:
gruss by OHR
Jimmy
DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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....
DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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 :-)
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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()
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von Tom »

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: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag von Werner_Bayern »

Bitte. Zufall.
es grüßt

Werner

<when the music is over, turn off the lights!>
DelUser01

Re: Vergleich 2er Arrays [ERLEDIGT]

Beitrag 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] ) )
Antworten