Array von Arrays bearbeiten

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Bergkaffee
*
Beiträge: 14
Registriert: Di, 15.03.2011 13:11

Array von Arrays bearbeiten

Beitrag von Bergkaffee »

Hallo zusammen,

ich bastle schon seit längerem für unser Büro einige Berechnungstools via Basic die ausschliesslich in Calc-Dokumenten verwendet werden.
Nun ist mir folgendes aufgefallen: Ich ziehe mir Ausgangsdaten aus der Tabelle mittels .getDataArray, rechne einige Daten der Tabelle um und speichere sie mit .setDataArray wieder zurück. Wenn ich nun ein Spaltenarray der Sequenz bearbeite bin ich bis jetzt davon ausgegangen, dass ich das Spaltenarray danach wieder an das Zeilenarray zurückspeichern muss. Mit Schrecken hab ich nun aber festgestellt, dass das Zeilenarray geändert wird, wenn das Spaltenarray modifiziert wird.
Kleines Beispiel:

Code: Alles auswählen

PTab = ThisComponent.Sheets().getByName( "Punkte" )
ITab = ThisComponent.Sheets().getByName( "Protokoll" )

'Letzte Zeile finden
ICur = PTab.createCursor
ICur.GotoEndOfUsedArea(False)
eRow = ICur.getRangeAddress().endRow

'Bearbeitungsbereich einlesen
Bereich = PTab.getCellRangeByPosition(0, 2,14, 10 )
Punkte  = Bereich.getDataArray
	
'Testschleife
For i = lBound(Punkte) to uBound(Punkte)
	Redim Zeile()
	Zeile = Punkte(i)
	Zeile(0) = "neiiiiiiiiiiiin"
Next i

'zurückspeichern
Bereich.setDataArray(Punkte)
Ich war bis her der Meinung das nach

Code: Alles auswählen

Zeile(0) = "neiiiiiiiiiiiin"
noch

Code: Alles auswählen

Punkte(i) = Zeile
stehen müsste damit eine Änderung übernommen wird.

Gibt es hier eine globale Einstellung die für dieses Verhalten verantwortlich sein kann oder darf ich nun einige hundert Seiten Quellcode durchgehen und an jeder einzigen Stelle meinen Fehler ausbügeln?

(Hab ich schon erwähnt, dass ich seit einigen Stunden damit beschäftigt bin meinen Kopf auf den Tisch zu donnern :? )
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Array von Arrays bearbeiten

Beitrag von F3K Total »

Hi,
du solltest die Zeile auch zurückschreiben:

Code: Alles auswählen

    'Testschleife
    For i = lBound(Punkte) to uBound(Punkte)
       Zeile = Punkte(i)
       Zeile(0) = "neiiiiiiiiiiiin"
       Punkte(i) = Zeile
    Next i
oder direkt drauf:

Code: Alles auswählen

    'Testschleife
    For i = lBound(Punkte) to uBound(Punkte)
        Punkte(i)(0) = "neiiiiiiiiiiiin"
    Next i
Gruß R
Bergkaffee
*
Beiträge: 14
Registriert: Di, 15.03.2011 13:11

Re: Array von Arrays bearbeiten

Beitrag von Bergkaffee »

Genau das meine ich: beide varianten verändern das Array Punkte().
Sowohl

Code: Alles auswählen

'Testschleife
    For i = lBound(Punkte) to uBound(Punkte)
       Zeile = Punkte(i)
       Zeile(0) = "neiiiiiiiiiiiin"
       Punkte(i) = Zeile
    Next i
als auch

Code: Alles auswählen

'Testschleife
    For i = lBound(Punkte) to uBound(Punkte)
       Zeile = Punkte(i)
       Zeile(0) = "neiiiiiiiiiiiin"
    Next i
liefern also das gleiche Ergebniss.

Ist das normal? Da ich bis dato immer meinte das letztere Variante keine Auswirkung auf das übergeordnete (hier Punkte) Array hat.
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Array von Arrays bearbeiten

Beitrag von F3K Total »

Bergkaffee hat geschrieben:Ist das normal?
Ich bin kein Informatiker, aber ich denke Ja, denn du schreibst in ein bereits bestehendes Array ( die Zeile)
So geht es, ohne "Punkte" zu verändern:

Code: Alles auswählen

    Punkte  = Bereich.getDataArray
    n =  Ubound(Punkte(0))
    dim myRow (n) as variant
    'Testschleife
    For i = lBound(Punkte) to uBound(Punkte)
       Zeile = Punkte(i)
       myRow(0) = "neiiiiiiiiiiiin"
       for k = 1 to Ubound (Zeile)
           myRow(k) = Zeile(k)
       next k
    Next i
Gruß R
Bergkaffee
*
Beiträge: 14
Registriert: Di, 15.03.2011 13:11

Re: Array von Arrays bearbeiten

Beitrag von Bergkaffee »

Aber das Array Zeile() wird ja jedesmal mit

Code: Alles auswählen

Redim Zeile()
zurückgesetzt.

Und Zeile() ist ja eine eigene Variable. Gerade deswegen verstehe ich nicht warum das Array aus dem der Wert für Zeile() geändert wird, wenn Zeile() geändert wird.

Naja, bin schon einiges an Quellcode durchgegangen und es hat sich noch kein Problem aufgrund dieser Verhaltensweise ergeben.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Array von Arrays bearbeiten

Beitrag von DPunch »

Servus
Bergkaffee hat geschrieben:Gerade deswegen verstehe ich nicht warum das Array aus dem der Wert für Zeile() geändert wird, wenn Zeile() geändert wird.
Da es sich bei "Punkte(i)" um ein Array handelt, enthält die Variable selber, also "Punkte(i)", nur eine sogenannte Referenz auf die Speicheradresse, an der dieses Array hinterlegt ist, nicht wie z.B. einen einfachen Integer den tatsächlichen Wert.
Ein Zugriff wie "Punkte(i)(0)" wird aufgelöst, indem zuerst das Array im Speicher über die Referenz in "Punkte(i)" ausfindig gemacht wird und dort dann der Inhalt des ersten Elements ausgelesen wird. Bei einer Zuweisung wie "Punkte(i)(0) = 5" wird ebenfalls erst das Array ausfindig gemacht und dann im Speicherbereich, der für das erste Element reserviert ist, das Bitmuster für die Zahl 5 geschrieben.

Die Zuweisung

Code: Alles auswählen

Zeile = Punkte(i)
bedeutet, dass die in "Punkte(i)" gespeicherte Referenz auf das ursprüngliche Array zusätzlich in "Zeile" gepeichert wird.
Beide Variablen zeigen also auf die gleiche Speicheradresse.
Ein

Code: Alles auswählen

Zeile(0) = 5
wird nun wie oben erklärt über die gespeicherte Referenz das Array im Speicher ausfindig machen und genau an der gleichen Stelle, an der auch bei einem Aufruf von "Punkte(i)(0)" nach dem Wert gesucht wird, die 5 schreiben.

Für mehr Informationen kannst Du bei Bedarf mal nach Stichworten wie "Referenz Java" o.Ä. googlen.
Antworten