Array mit Unterarray belegen = Verweise?

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: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Array mit Unterarray belegen = Verweise?

Beitrag von Jan »

Moin,

gestern habe ich mit einem Phänomen gekämpft, das ich ehrlich gesagt nicht verstehe. Ich habe zwei Lösungswege gefunden, aber warum das so ist ist mir noch unklar. Der Code sieht schematisch so aus:

Code: Alles auswählen

Do While .NOT. cDbf1->(EoF())
   cString1 := ...
   cString2 := ...
   aDetails := {...}
   AAdd(aHauptarray, {cString1, cString2, aDetails}
   cDbf1->(DbSkip())
ENDDO
aDetails := {}

Do While .NOT. cDbf2->(EoF())
   cString1 := ...
   cString2 := ...
   aDetails := {...}
   AAdd(aHauptarray, {cString1, cString2, aDetails}
   cDbf2->(DbSkip())
ENDDO
aDetails := {}

Do While .NOT. cDbf3->(EoF())
   cString1 := ...
   cString2 := ...
   aDetails := {...}
   AAdd(aHauptarray, {cString1, cString2, aDetails}
   cDbf3->(DbSkip())
ENDDO
aDetails := {}
Hier passiert folgendes: Die Unterarrays werden immer korrekt belegt. cString1, cString2, und aDetails werden korrekt belegt, und die entsprechenden Werte landen auch korrekt im Unterarray von aHauptarray.

Sobald aber der nächste Do-While-Block abgearbeitet wird, wird der Inhalt von aDetails in den Sätzen, die der vorige Block angelegt hat, mit dem Inhalt von aDetails aus dem aktuellen Block überschrieben! mehrfach getestet. Nur die Daten des vorigen Blocks.

Dazu stellen sich mir zwei Fragen:
  • Warum macht der das überhaupt?
  • Wenn der schon irgendwie mit Verweisen auf das Array aDetails arbeitet, oder so tut als seien das detached Locals - warum dann nicht mit allen Unterarrays, sondern nur mit denen des vorigen blocks?
Wir haben gestern mit zwei Entwicklern darüber gesessen und keine Antwort dazu gefunden.

Lösungswege gibt es zwei:
  • Nicht aDetails in das Unterarray einfügen, sondern vor dem Füllen des Unterarrays aDetails1 := AClone(aDetails) machen, und dann in das Unterarray die aDetails1 einfügen
  • Vor jeder Schleife ein aDetails := NIL, aDetails := {} schreiben
Mir ist bewußt, das wir gerade erst eine Diskussion über Verweise und Arrays gehabt haben. Das hat gestern bei der Lösungsfindung geholfen. Aber verstehen tun wir zwei das in diesem Fall nicht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array mit Unterarray belegen = Verweise?

Beitrag von brandelh »

kannst du die Belegung von aDetails genauer schreiben ?

Mit der neuen Zuweisung aDetails := {} müsste eigentlich ein neuer Speicherbereich für das Ziel aDetails angelegt werden, aber eventuell holst du dir die alten Inhalte einmalig da rein ...
Gruß
Hubert
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Re: Array mit Unterarray belegen = Verweise?

Beitrag von Lewi »

Ich vermute mal,daß mit: "AAdd(aHauptarray, {cString1, cString2, aDetails}" bei der Addition auf aDetails eine Referenz (Pointer) gesetzt wird. Evtl. würde
AAdd(aHauptarray, {cString1, cString2, aClone(aDetails)} das Problem lösen?
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2934
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Array mit Unterarray belegen = Verweise?

Beitrag von Wolfgang Ciriack »

So wie Lewi sagt, AClone verwenden!
Viele Grüße
Wolfgang
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array mit Unterarray belegen = Verweise?

Beitrag von brandelh »

Code: Alles auswählen

   aDetails := {...}
   AAdd(aHauptarray, {cString1, cString2, aDetails}
in der 2. Zeile wird auf jeden Fall ein Pointer auf aDetails gesetzt, aber die Zeile davor müsste für jeden Satz ein neues aDetails anlegen und dann müssten die Pointer auf der Ebene stimmen.
Ich bin mir aber nicht sicher ob auch Pointer auf cString1 und cString2 gesetzt werden, wenn hier etwas schief läuft wäre (cString1) und (cString2) sinnvoll um sicher nur die Inhalte zu übernehmen.

Bei Problemen mit aDetails vermute ich eher, dass das Problem im nicht genannten Rest der Zuweisung {...} liegt. Bitte diesen näher angeben.
Auch wäre eine Liste der Inhalte (schematisch) die sich ergeben hilfreich.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Array mit Unterarray belegen = Verweise?

Beitrag von Jan »

Olaf: So wie Du das schreibst hatte ich das auch versucht. Wollte nicht. Was aber auch daran liegen kann, daß ich das nur punktuell gemacht hatte. Wie gesagt: Wenn ich statt des Einfügens von aDetail ein aDetail1 := AClone(aDetail) mache, und dann aDetail1 einfüge, dann klappt das.

Hubert: cString1 und cString2 sind einfache Textstrings. aDetails enthält (meist) auch nur einen einzigen Textstring (einen Dateinamen inkl. voller Pfadangabe). Das ist nur deswegen ein Array, weil auch mehrere Dateien eingetragen werden könnten.

Ich möchte aber an meine beiden Fragen erinnern, da ich die Lösungen, wie ich eni korrektes Ergebnis erziele, ja habe:
Warum überhaupt, und nur für aDetails, nicht aber für cString2 und cString2?
Warum immer nur ein Ersetzen in dem Block davor? Warum nicht alles?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array mit Unterarray belegen = Verweise?

Beitrag von brandelh »

Jan hat geschrieben:Warum überhaupt, und nur für aDetails, nicht aber für cString2 und cString2?
Warum immer nur ein Ersetzen in dem Block davor? Warum nicht alles?
aus meiner Sicht dürfte es gar nicht sein, denn die Zuweisung eines neuen Arrays bricht den alten LINK (Pointer).
Um aber überhaupt zu testen bräuchte man ein lauffähiges Programm, das den Vorgang simmuliert und jede Menge debbuging Zeit.

Vielleicht hätte ich die ja später noch, aber auf jeden Fall brauche ich dazu die Infos wie du aDetail füllst ;-)
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Array mit Unterarray belegen = Verweise?

Beitrag von Jan »

... wenn Du darauf bestehst:

Code: Alles auswählen

       AAdd(aDetails, pfadExe() + pfadFolien() + aDirectory[i][F_NAME])
Das gibt dann z. B. sowas wie P:\WAWI\05 Kunden_PDFs\1167311_Eingangsbestaetigung_14200694.00 23-01-14 14-56-55.pdf

Das AAdd() gibt es deswegen, weil ja wie geschrieben eventuell mehrere Dateien enthalten sein könnten, und die aus aDirectory zusammen gesammelt werden.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array mit Unterarray belegen = Verweise?

Beitrag von brandelh »

sind die Variablen eigentlich LOCAL oder PRIVATE ?
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array mit Unterarray belegen = Verweise?

Beitrag von brandelh »

AAdd(aHauptarray, {cString1, cString2, aDetails}
in der Zeile fehlt eine Klammer am Ende, hast du vielleicht mehr gelöscht ;-)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array mit Unterarray belegen = Verweise?

Beitrag von brandelh »

Hi,

ich denke dieser Code stellt deinen Ablauf ohne DBF dar:

Code: Alles auswählen

proc main
   local x
   local cStr1, cStr2, aDetails, aHauptarray

   aHauptarray := { }

   set alternate to Test.txt
   set alternate on

   for x = 1 to 5
       cStr1    := "c1A"+str(x,1)
       cStr2    := "c2A"+str(x,1)
       aDetails := { }
       ?
       ? "A"+str(x,3),cStr1,cStr2,aDetails
       AAdd(aDetails, "Detail A"+str(x,2)+" 1" )
       AAdd(aDetails, "Detail A"+str(x,2)+" 2" )
       AAdd(aHauptarray, {cStr1, cStr2, aDetails})
       ? "  D: ",aDetails
       ? "  H: ",aHauptarray
   next

   ?
   aDetails := {}

   for x = 1 to 5
       cStr1    := "c1B"+str(x,1)
       cStr2    := "c2B"+str(x,1)
       aDetails := { }
       ?
       ? "B"+str(x,3),cStr1,cStr2,aDetails
       AAdd(aDetails, "Detail B"+str(x,2)+" 1" )
       AAdd(aDetails, "Detail B"+str(x,2)+" 2" )
       AAdd(aHauptarray, {cStr1, cStr2, aDetails})
       ? "  D: ",aDetails
       ? "  H: ",aHauptarray
   next

   ?
   aDetails := {}

   for x = 1 to 5
       cStr1    := "c1C"+str(x,1)
       cStr2    := "c2C"+str(x,1)
       aDetails := { }
       ?
       ? "C"+str(x,3),cStr1,cStr2,aDetails
       AAdd(aDetails, "Detail C"+str(x,2)+" 1" )
       AAdd(aDetails, "Detail C"+str(x,2)+" 2" )
       AAdd(aHauptarray, {cStr1, cStr2, aDetails})
       ? "  D: ",aDetails
       ? "  H: ",aHauptarray
   next

   aDetails := {}

   ?
   ? "  D: ",aDetails
   ?
   ? "Ende"

return
wenn ich diesen compiliere und ausführe erhalte ich das Ergebnis:

Code: Alles auswählen



A  1 c1A1 c2A1 {}
  D:  {Detail A 1 1, Detail A 1 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}}

A  2 c1A2 c2A2 {}
  D:  {Detail A 2 1, Detail A 2 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}, {c1A2, c2A2, {Detail A 2 1, Detail A 2 2}}}

A  3 c1A3 c2A3 {}
  D:  {Detail A 3 1, Detail A 3 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}, {c1A2, c2A2, {Detail A 2 1, Detail A 2 2}}, {c1A3, c2A3, {Detail A 3 1, Detail A 3 2}}}

A  4 c1A4 c2A4 {}
  D:  {Detail A 4 1, Detail A 4 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}, {c1A2, c2A2, {Detail A 2 1, Detail A 2 2}}, {c1A3, c2A3, {Detail A 3 1, Detail A 3 2}}, {c1A4, c2A4, {Detail A 4 1, Detail A 4 2}}}

A  5 c1A5 c2A5 {}
  D:  {Detail A 5 1, Detail A 5 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}, {c1A2, c2A2, {Detail A 2 1, Detail A 2 2}}, {c1A3, c2A3, {Detail A 3 1, Detail A 3 2}}, {c1A4, c2A4, {Detail A 4 1, Detail A 4 2}}, {c1A5, c2A5, {Detail A 5 1, Detail A 5 2}}}


B  1 c1B1 c2B1 {}
  D:  {Detail B 1 1, Detail B 1 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}, {c1A2, c2A2, {Detail A 2 1, Detail A 2 2}}, {c1A3, c2A3, {Detail A 3 1, Detail A 3 2}}, {c1A4, c2A4, {Detail A 4 1, Detail A 4 2}}, {c1A5, c2A5, {Detail A 5 1, Detail A 5 2}}, {c1B1, c2B1, {Detail B 1 1, Detail B 1 2}}}

B  2 c1B2 c2B2 {}
  D:  {Detail B 2 1, Detail B 2 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}, {c1A2, c2A2, {Detail A 2 1, Detail A 2 2}}, {c1A3, c2A3, {Detail A 3 1, Detail A 3 2}}, {c1A4, c2A4, {Detail A 4 1, Detail A 4 2}}, {c1A5, c2A5, {Detail A 5 1, Detail A 5 2}}, {c1B1, c2B1, {Detail B 1 1, Detail B 1 2}}, {c1B2, c2B2, {Detail B 2 1, Detail B 2 2}}}

B  3 c1B3 c2B3 {}
  D:  {Detail B 3 1, Detail B 3 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}, {c1A2, c2A2, {Detail A 2 1, Detail A 2 2}}, {c1A3, c2A3, {Detail A 3 1, Detail A 3 2}}, {c1A4, c2A4, {Detail A 4 1, Detail A 4 2}}, {c1A5, c2A5, {Detail A 5 1, Detail A 5 2}}, {c1B1, c2B1, {Detail B 1 1, Detail B 1 2}}, {c1B2, c2B2, {Detail B 2 1, Detail B 2 2}}, {c1B3, c2B3, {Detail B 3 1, Detail B 3 2}}}

B  4 c1B4 c2B4 {}
  D:  {Detail B 4 1, Detail B 4 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}, {c1A2, c2A2, {Detail A 2 1, Detail A 2 2}}, {c1A3, c2A3, {Detail A 3 1, Detail A 3 2}}, {c1A4, c2A4, {Detail A 4 1, Detail A 4 2}}, {c1A5, c2A5, {Detail A 5 1, Detail A 5 2}}, {c1B1, c2B1, {Detail B 1 1, Detail B 1 2}}, {c1B2, c2B2, {Detail B 2 1, Detail B 2 2}}, {c1B3, c2B3, {Detail B 3 1, Detail B 3 2}}, {c1B4, c2B4, {Detail B 4 1, Detail B 4 2}}}

B  5 c1B5 c2B5 {}
  D:  {Detail B 5 1, Detail B 5 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}, {c1A2, c2A2, {Detail A 2 1, Detail A 2 2}}, {c1A3, c2A3, {Detail A 3 1, Detail A 3 2}}, {c1A4, c2A4, {Detail A 4 1, Detail A 4 2}}, {c1A5, c2A5, {Detail A 5 1, Detail A 5 2}}, {c1B1, c2B1, {Detail B 1 1, Detail B 1 2}}, {c1B2, c2B2, {Detail B 2 1, Detail B 2 2}}, {c1B3, c2B3, {Detail B 3 1, Detail B 3 2}}, {c1B4, c2B4, {Detail B 4 1, Detail B 4 2}}, {c1B5, c2B5, {Detail B 5 1, Detail B 5 2}}}


C  1 c1C1 c2C1 {}
  D:  {Detail C 1 1, Detail C 1 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}, {c1A2, c2A2, {Detail A 2 1, Detail A 2 2}}, {c1A3, c2A3, {Detail A 3 1, Detail A 3 2}}, {c1A4, c2A4, {Detail A 4 1, Detail A 4 2}}, {c1A5, c2A5, {Detail A 5 1, Detail A 5 2}}, {c1B1, c2B1, {Detail B 1 1, Detail B 1 2}}, {c1B2, c2B2, {Detail B 2 1, Detail B 2 2}}, {c1B3, c2B3, {Detail B 3 1, Detail B 3 2}}, {c1B4, c2B4, {Detail B 4 1, Detail B 4 2}}, {c1B5, c2B5, {Detail B 5 1, Detail B 5 2}}, {c1C1, c2C1, {Detail C 1 1, Detail C 1 2}}}

C  2 c1C2 c2C2 {}
  D:  {Detail C 2 1, Detail C 2 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}, {c1A2, c2A2, {Detail A 2 1, Detail A 2 2}}, {c1A3, c2A3, {Detail A 3 1, Detail A 3 2}}, {c1A4, c2A4, {Detail A 4 1, Detail A 4 2}}, {c1A5, c2A5, {Detail A 5 1, Detail A 5 2}}, {c1B1, c2B1, {Detail B 1 1, Detail B 1 2}}, {c1B2, c2B2, {Detail B 2 1, Detail B 2 2}}, {c1B3, c2B3, {Detail B 3 1, Detail B 3 2}}, {c1B4, c2B4, {Detail B 4 1, Detail B 4 2}}, {c1B5, c2B5, {Detail B 5 1, Detail B 5 2}}, {c1C1, c2C1, {Detail C 1 1, Detail C 1 2}}, {c1C2, c2C2, {Detail C 2 1, Detail C 2 2}}}

C  3 c1C3 c2C3 {}
  D:  {Detail C 3 1, Detail C 3 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}, {c1A2, c2A2, {Detail A 2 1, Detail A 2 2}}, {c1A3, c2A3, {Detail A 3 1, Detail A 3 2}}, {c1A4, c2A4, {Detail A 4 1, Detail A 4 2}}, {c1A5, c2A5, {Detail A 5 1, Detail A 5 2}}, {c1B1, c2B1, {Detail B 1 1, Detail B 1 2}}, {c1B2, c2B2, {Detail B 2 1, Detail B 2 2}}, {c1B3, c2B3, {Detail B 3 1, Detail B 3 2}}, {c1B4, c2B4, {Detail B 4 1, Detail B 4 2}}, {c1B5, c2B5, {Detail B 5 1, Detail B 5 2}}, {c1C1, c2C1, {Detail C 1 1, Detail C 1 2}}, {c1C2, c2C2, {Detail C 2 1, Detail C 2 2}}, {c1C3, c2C3, {Detail C 3 1, Detail C 3 2}}}

C  4 c1C4 c2C4 {}
  D:  {Detail C 4 1, Detail C 4 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}, {c1A2, c2A2, {Detail A 2 1, Detail A 2 2}}, {c1A3, c2A3, {Detail A 3 1, Detail A 3 2}}, {c1A4, c2A4, {Detail A 4 1, Detail A 4 2}}, {c1A5, c2A5, {Detail A 5 1, Detail A 5 2}}, {c1B1, c2B1, {Detail B 1 1, Detail B 1 2}}, {c1B2, c2B2, {Detail B 2 1, Detail B 2 2}}, {c1B3, c2B3, {Detail B 3 1, Detail B 3 2}}, {c1B4, c2B4, {Detail B 4 1, Detail B 4 2}}, {c1B5, c2B5, {Detail B 5 1, Detail B 5 2}}, {c1C1, c2C1, {Detail C 1 1, Detail C 1 2}}, {c1C2, c2C2, {Detail C 2 1, Detail C 2 2}}, {c1C3, c2C3, {Detail C 3 1, Detail C 3 2}}, {c1C4, c2C4, {Detail C 4 1, Detail C 4 2}}}

C  5 c1C5 c2C5 {}
  D:  {Detail C 5 1, Detail C 5 2}
  H:  {{c1A1, c2A1, {Detail A 1 1, Detail A 1 2}}, {c1A2, c2A2, {Detail A 2 1, Detail A 2 2}}, {c1A3, c2A3, {Detail A 3 1, Detail A 3 2}}, {c1A4, c2A4, {Detail A 4 1, Detail A 4 2}}, {c1A5, c2A5, {Detail A 5 1, Detail A 5 2}}, {c1B1, c2B1, {Detail B 1 1, Detail B 1 2}}, {c1B2, c2B2, {Detail B 2 1, Detail B 2 2}}, {c1B3, c2B3, {Detail B 3 1, Detail B 3 2}}, {c1B4, c2B4, {Detail B 4 1, Detail B 4 2}}, {c1B5, c2B5, {Detail B 5 1, Detail B 5 2}}, {c1C1, c2C1, {Detail C 1 1, Detail C 1 2}}, {c1C2, c2C2, {Detail C 2 1, Detail C 2 2}}, {c1C3, c2C3, {Detail C 3 1, Detail C 3 2}}, {c1C4, c2C4, {Detail C 4 1, Detail C 4 2}}, {c1C5, c2C5, {Detail C 5 1, Detail C 5 2}}}

  D:  {}

Ende
aus meiner Sicht widerspricht es deiner Aussage, dass die Arrays alten Inhalt behalten.
Dateianhänge
Test.txt
(6.13 KiB) 162-mal heruntergeladen
test.prg
(1.41 KiB) 183-mal heruntergeladen
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array mit Unterarray belegen = Verweise?

Beitrag von brandelh »

gleiches Ergebnis wenn man private nutzt:

Code: Alles auswählen

*  local   cStr1, cStr2, aDetails, aHauptarray
   memvar  cStr1, cStr2, aDetails, aHauptarray
   private cStr1, cStr2, aDetails, aHauptarray
oder public

Code: Alles auswählen

*  local   cStr1, cStr2, aDetails, aHauptarray
   memvar  cStr1, cStr2, aDetails, aHauptarray
   public  cStr1, cStr2, aDetails, aHauptarray
immer das gleiche Ergebnis !
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Array mit Unterarray belegen = Verweise?

Beitrag von Jan »

Hubert,

das sind alles LOCALs. Und die Klammer ist nur ein Übertragungsfehler, das hätte ja auch schon beim Kompilieren gemeckert.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Array mit Unterarray belegen = Verweise?

Beitrag von Manfred »

Moin,

ich pack mal meinen Senf dazu. ich bin mir nicht sicher, ob es klar rübergekommen ist, oder kommt.

Code: Alles auswählen

Do While .NOT. cDbf2->(EoF())
   cString1 := ...
   cString2 := ...
   aDetails := {...}
   AAdd(aHauptarray, {cString1, cString2, aDetails}
   cDbf2->(DbSkip())
ENDDO
Wenn man nach dem AAdd(aHauptarray....) im Debugger nachschaut, ist beim 1.Durchgang aDetails leer
Wenn man dann aber aadd(aDetails, "test") macht und dann aDetails sofort anschaut, steht der neue Wert drin. Auch an der Stelle in aHauptarray, an der aDetails steht. Vielleicht verdeutlicht das die Situation? Das ist das was Jan meint. Und deshalb sieht es für mich so aus, als wenn in aHauptarray eine Referenz auf das aDetails Array steht. Und alles was nach dem Aadd(aHauptarray) passiert auch in selbigem angezeigt wird. Deshalb hatte ich die Idee beim Testen, es mit Aclone() zu versuchen, weil wir dieses Thema ja schon des öfteren hatten. Und dannklappt es ja
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: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array mit Unterarray belegen = Verweise?

Beitrag von brandelh »

Hallo Manfred,

im Prinzip hast du zwar Recht, dass eine Referenz gespeichert wird, aber eben IMMER EINE ANDERE !

Schau dir meine Ergebnisse an, da ist kein Problem zu erkennen.
JAN muss nun sehen ob ich falsch übersetzt habe oder er in seinem Code anders vorgeht (von der Datei mal abgesehen) ...
Gruß
Hubert
Antworten