ASort() auf mehrdimensionales Array [Erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

ASort() auf mehrdimensionales Array [Erledigt]

Beitrag von Jan »

Gerade stoße ich auf ein merkwürdiges Phänomen: Ich möchte ein mehrdimensionales Array sortieren. Was ja weiter kein Problem ist. Aber: In diesem Fall werden Daten von einem Arraysatz in andere kopiert! Ausgangsbasis ist ein Array, das aus solchen Elementen besteht:

Code: Alles auswählen

{Element1, Element2, {Element3.1, Element3.2, ...}}
Wobei das Array mit Element3 auch mal leer sein kann, also einfach nur ein {}.

Jetzt sortiere ich das Ganze:

Code: Alles auswählen

aKundenInformationen := ASort(aKundenInformationen, , , {|x, y| CToD(SubStr(x[1], 1, 8)) > CToD(SubStr(y[1], 1, 8))})
Das hat tadellos funktioniert. Bis ich Element3 eingebaut hatte. Denn jetzt wird jeder Arraysatz im 3. Element mit dem Inhalt des 3. Elementes in Satz 1 gefüllt! Ich kann das im Debugger nachverfolgen: Vor dem Sortieren ist z. B. nur ein Arraysatz in Element3 gefüllt, nach dem Sortieren sind es alle.

Wie kann das sein?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2125
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 75 Mal

Re: ASort() auf mehrdimensionales Array

Beitrag von Werner_Bayern »

Servus Jan,

Das jew. übergebene Array x sieht also so aus:
{Element1, Element2, {Element3.1, Element3.2, ...}}
Also bezieht sich

Code: Alles auswählen

CToD(SubStr(x[1], 1, 8))
auf "Element1" (= x[1]), der Rest ist uninteressant.
Ein Asort sollte ja nur die Reihenfolge ändern, nicht den Inhalt. Oder verstehe ich Dich da falsch?
Zuletzt geändert von Werner_Bayern am Di, 18. Feb 2014 15:10, insgesamt 1-mal geändert.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: ASort() auf mehrdimensionales Array

Beitrag von Jan »

:thumbright:

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2825
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: ASort() auf mehrdimensionales Array

Beitrag von georg »

Hallo, Jan -


mit diesem kleinen Programm kann ich das von Dir geschilderte Problem nicht (!) nachvollziehen:

Code: Alles auswählen

FUNCTION Main()
   Local aData, aData2

   aData := {;
      {"20131102", "Hugo", {}},;
      {"20131213", "von", {1, 2, 3}},;
      {"20140101", "Hoffmansthal", {.T., .F., 18}};
      }

   aData2 := ASort(aData, , , {|x, y| CToD(SubStr(x[1], 1, 8)) > CToD(SubStr(y[1], 1, 8))})
Was im ersten Moment irritiert, ist dass der Debugger im ersten Array als drittes Element {1, 2, 3} anzeigt, was aber korrekt ist, da durch die Sortierung das letzte Element zum ersten wird. Bei meinem Beispiel wird das erste Array-Element zum letzten, und da ist das Subarray weiterhin {}.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: ASort() auf mehrdimensionales Array

Beitrag von Jan »

Hallo Georg,

bislang kenne ihc dieses Phänomen auch nicht. Ich sortiere sehr häufig mehrdimensionale Arrays, und hatte nie Probleme damit. Das Problem hier ist, das ich im Debugger genau sehen kann, das vor der ASort()-Zeile alles OK ist, und hinterher nicht mehr. Was ich geringfügig irritierend finde.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2825
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: ASort() auf mehrdimensionales Array

Beitrag von georg »

Hallo, Jan -


hast Du mein Beispiel mal ausprobiert?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: ASort() auf mehrdimensionales Array

Beitrag von UliTs »

Jan hat geschrieben:Gerade stoße ich auf ein merkwürdiges Phänomen: Ich möchte ein mehrdimensionales Array sortieren. Was ja weiter kein Problem ist. Aber: In diesem Fall werden Daten von einem Arraysatz in andere kopiert! ...
Du schreibst: "mehrdimensionales Array". Genau genommen gibt es dass in xBase++ ja nicht. Stattdessen sind Element1, Element2, etc. Zeiger auf weitere (eindimensionale) Arrays. Kann es vielleicht sein, dass einige Zeiger auf den gleichen Speicher und damit physikalisch gleiche Arrays zeigen?

Ansonsten sehe ich auch nichts, was falsch laufen könnte -> siehe Georg's Beitrag.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: ASort() auf mehrdimensionales Array [Erledigt]

Beitrag von Jan »

So, das scheint erledigt zu sein. Und irgendwann schmeiß ich die Kiste an die Wand! Wie oft hatte ich das jetzt schon, das unerklärliche Fehler aufgetaucht sind, und am nächsten Tag (nach einem Rechnerneustart und einem kompletten Rebuild des Projektes) läuft es plötzlich. Aber immer nur hier bei meinem Kunden. Kann das daran liegen, das hier alles im Netz liegt? Also auch die Alaska-Installation, die prg, die exe, alles?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: ASort() auf mehrdimensionales Array [Erledigt]

Beitrag von Tom »

Ich verwende ASort() nicht so:

Code: Alles auswählen

aKundenInformationen := ASort(aKundenInformationen, , , {|x, y| CToD(SubStr(x[1], 1, 8)) > CToD(SubStr(y[1], 1, 8))})
ASort ist zwar eine Funktion, aber es ist nicht sehr sinnvoll, ihren Rückgabewert zu betrachten, da Arrays in Funktionen immer per reference betrachtet werden. ASort() ändert also das Array ohnehin. Die Rückgabe ist nur eine Referenz auf das sortierte Array, also belanglos - es sei denn, ich benötige einen zweiten Zeiger auf dasselbe Array.

Richtiger:

Code: Alles auswählen

ASort(aKundenInformationen, , , {|x, y| CToD(SubStr(x[1], 1, 8)) > CToD(SubStr(y[1], 1, 8))})
Benötige ich eine Kopie des sortierten Arrays (weil ":="-Zuweisungen mit Arrays keine Kopien erzeugen):

Code: Alles auswählen

a2 := aClone(ASort(aKundenInformationen, , , {|x, y| CToD(SubStr(x[1], 1, 8 )) > CToD(SubStr(y[1], 1, 8 ))}))
Kann es sein, dass der Hund hier irgendwo begraben ist?
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: ASort() auf mehrdimensionales Array [Erledigt]

Beitrag von Jan »

Hallo Tom,

Uli hatte ja weiter oben ein Beispiel gepostet, das bei ihm lief. Ich hatte genau diesen Punkt in seinem Beispiel aber zum Anlaß genommen, genau das mal zu ändern: Die Variable, die das sortierte Array speichern sollte, habe ich einfach mal umbenannt. Was keinerlei Auswirkungen auf den Fehler hatte.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten