Lookup-table, Mehrdimensionales Array deklarieren

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

Moderator: Moderatoren

saxo
**
Beiträge: 48
Registriert: Do, 01.04.2010 00:45

Lookup-table, Mehrdimensionales Array deklarieren

Beitrag von saxo »

Hallo,
für eine Lookup-table brauche ich ein mehrdimensionales array das mir Konstanten gefüllt ist, also während einer Sitzung nicht mehr geändert wird. Gelesen habe ich, dass Const mit arrays nicht funktioniert aber Static. Wie aber fülle ich das mehrdimensionale array während der Deklaration, so dass es nicht bei jedem Funktionsaufruf wieder neu gefüllt wird?
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Lookup-table, Mehrdimensionales Array deklarieren

Beitrag von F3K Total »

Hallo Saxon,
ob es der einzige Weg ist, kann ich nicht sagen, aber so geht es:
1.) Dimensioniere das Array als globale Variable

Code: Alles auswählen

global MyArray(10,10) as integer
2.) fülle es mit einer Sub, die beim Aufruf der Datei einmalig ausgeführt wird (Extras/Anpassen/Ereignisse/Dokument öffnen) ala

Code: Alles auswählen

Sub fill_array
number=0
for i=0 to 10
for k=0 to 10
myarray(i,k)=number
number=number+1
next k
next i
end sub
Gruß R
saxo
**
Beiträge: 48
Registriert: Do, 01.04.2010 00:45

Re: Lookup-table, Mehrdimensionales Array deklarieren

Beitrag von saxo »

Vielen Dank R, wenn ich das richtig vertehe müsste dann jeder user der mein Programm verwendet den Funktionsaufruf in Calc eintragen (in Extras-Anpassen-Ereignisse). Die user sind leider nicht alle so clever.

Die arrays sind schlecht dokumentiert. In der Hilfe für "static" steht: "Deklariert eine Variable oder ein Array innerhalb einer Subroutine oder Funktion auf Prozedurebene, sodass der Variablen- oder Arraywert auch nach Verlassen der Subroutine bzw. Funktion erhalten bleibt."
Das würde aber doch bedeuten, dass ich das array auch bei der Deklaration befüllen können müsste, andernfalls würde die Routine zum Befüllen bei jedem Funktionsaufruf durchlaufen.

Irgendwo habe ich noch das gelesen, funktioniert aber bei mir nicht:
ar() = Array(Array(1,2,3),_Array(7,8,9))

Hat noch jemand eine Idee??
gogo
*****
Beiträge: 207
Registriert: Mi, 10.11.2010 13:11

Re: Lookup-table, Mehrdimensionales Array deklarieren

Beitrag von gogo »

Du kannst ja am Beginn der Sub prüfen ob was im Array drinsteht - wenn ja: Befüllen nicht notwendig etc.

g
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Lookup-table, Mehrdimensionales Array deklarieren

Beitrag von Stephan »

wenn ich das richtig vertehe müsste dann jeder user der mein Programm verwendet den Funktionsaufruf in Calc eintragen (in Extras-Anpassen-Ereignisse)
Nein, wieso denn?
Die arrays sind schlecht dokumentiert.


Wieso?
Irgendwo habe ich noch das gelesen
,

Wo?
funktioniert aber bei mir nicht
Bei mir auch nicht, zumal ich nicht wüßte wieso ein Ausdruck wie "_Array(7,8,9)" überhaupt funktionieren sollte.
Hingegen brauchte ich gerade 30 Sekunden um testen das Folgendes funktioniert:

Code: Alles auswählen

ar() = Array(Array(1,2,3),Array(7,8,9))

Gruß
Stephan
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Lookup-table, Mehrdimensionales Array deklarieren

Beitrag von F3K Total »

Moin,
Stephan hat geschrieben:Hingegen brauchte ich gerade 30 Sekunden um testen das Folgendes funktioniert:

Code: Alles auswählen
ar() = Array(Array(1,2,3),Array(7,8,9))
ja, das klappt auch bei mir, aber nur wenn ich diese Zeile in die Prozedur schreibe.
Oberhalb, ob mit Dim oder Const bekomme ich eine Fehlermeldung.
Mache ich was falsch?
Die Frage war:
Wie fülle ich ein Array einmalig, nicht bei jedem Prozeduraufruf? Erschwerend kommt hinzu, das Dokumentereignisse nicht verwendet werden sollen.

Gruß R
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Lookup-table, Mehrdimensionales Array deklarieren

Beitrag von Stephan »

Mache ich was falsch?
Nein
Die Frage war:
Wie fülle ich ein Array einmalig, nicht bei jedem Prozeduraufruf?
Die schien aber doch durch Deinen post längst beantwortet?
Erschwerend kommt hinzu, das Dokumentereignisse nicht verwendet werden sollen.
Also davon weiß ich dann nichts. Ich lese jedenfalls nur:
Vielen Dank R, wenn ich das richtig vertehe müsste dann jeder user der mein Programm verwendet den Funktionsaufruf in Calc eintragen (in Extras-Anpassen-Ereignisse). Die user sind leider nicht alle so clever.
was für mich nun nicht heißt 'soll nicht verwendet werden' sondern nur das es nicht nötig sein soll das die Nutzer hierzu irgendwas selbst ausfüllen müssen. Die 'Vermeidung' des Letzteren ist jedoch insich eine gänzlich überflüssige Forderun g weil sich im Normalfall nicht einmal die Notwendigkeit stellt zu erwägen das der Nutzer irgendwas diesbezüglich ausfüllen muß, denn irgendwie muß das Makro ja verteilt werden und solangfe das per Dokument geschieht ist ein Autostartmakro, das das Array befüllt, doch wohl kein Problem.


Gruß
Stephan
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Lookup-table, Mehrdimensionales Array deklarieren

Beitrag von F3K Total »

Hallo Stephan,
da habe ich mich wohl aufs Glatteis führen lassen. (Es war früh heute morgen)

@Saxo: Keiner muß besonders clever sein und irgendwas eintragen, siehe vorigen Beitrag von Stephan.

Gruß R
saxo
**
Beiträge: 48
Registriert: Do, 01.04.2010 00:45

Re: Lookup-table, Mehrdimensionales Array deklarieren

Beitrag von saxo »

Danke für die Vorschläge, aber ich bekomme gar nichts zum Laufen.
In der anhängenden Datei versuche ich die Funktion INIT_ARRAY() in "Anpassen-Ereignisse-Laden_des_Dokuments_beendet" aufzurufen.
Die Funktion Test_ARRAY() steht in Zelle A1 und gibt beim Öffnen der Datei den Inhalt des Arrays aus.

Das gibt zwar keinen Fehler, funktioniert aber nicht: i() = Array(Array(1,2,3),Array(7,8,9))

Das Füllen des Arrays geht nicht in INIT_ARRAY(): i(x,y) = z .

Das Entfernen von Makros aus Anpassen-Ereignisse funktioniert nicht (nach Wiederöffnen stehen die Makroaufrufe wieder drin, LibreOffice 3.4.3 )

"Static" kann nur innerhalb einer Funktion verwendet werden, "Static Global i()" oder "Static Public i()" geht nicht, damit sehe ich keine Möglichkeit ein mit Static deklariertes Array von ausserhalb einer Funktion zu befüllen.

@Stephan:
>Die 'Vermeidung' des Letzteren ist jedoch insich eine gänzlich überflüssige Forderun g weil sich im Normalfall nicht >einmal die Notwendigkeit stellt zu erwägen das der Nutzer irgendwas diesbezüglich ausfüllen muß
Deutsch Leistungskurs?
Dateianhänge
Test_Array.ods
(8.76 KiB) 85-mal heruntergeladen
gogo
*****
Beiträge: 207
Registriert: Mi, 10.11.2010 13:11

Re: Lookup-table, Mehrdimensionales Array deklarieren

Beitrag von gogo »

Das Laden des Dokuments ist erst NACH der Berechnung der Zellen abgeschlossen - das Array wird also ausgewertet bevor es befüllt wurde.

Code: Alles auswählen

Global i(1,2) As Single

Function INIT_ARRAY()
i(0,0) = 1
i(1,0) = 7
msgbox "Done"
END Function


Function TEST_ARRAY()
REM i() = Array(Array(1,2,3),Array(7,8,9)) funktioniert nicht!!
REM i(0,0) = 1
REM i(1,0) = 7
MsgBox "(0,0): "&Str(i(0,0))&Chr(13)&"(0,1): "&Str(i(0,1))&Chr(13)&"(0,2): "&Str(i(0,2))&Chr(13)&"(1,0): "&Str(i(1,0))&Chr(13)&"(1,1): "&Str(i(1,1))&Chr(13)&"(1,2): "&Str(i(1,2))
End Function
Die msgbox "Done" hab' ich dazugeschrieben, dann siehst Du zu welchem Zeitpunkt die Funktion läuft.

Wenn Du nach dem Done-Prompt [Strg]+[Umschalt]+[F9] eingibst, werden die Zellen neu berechnet, dann kommen in der Fkt TEST_ARRAY() auch die richtigen Werte.

g
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Lookup-table, Mehrdimensionales Array deklarieren

Beitrag von DPunch »

Aloha

Es gibt keinen nachvollziehbaren Grund, das Befüllen über eine Autostart-Funktion zu machen - wenn Du sowieso schon im Basic Code bist, kannst Du auch eine schlichte Überprüfung dort einführen.

Code: Alles auswählen

Global i() As Single

Function INIT_ARRAY()
ReDim i(1,2) as Single
i(0,0) = 1
i(1,0) = 7
END Function


Function TEST_ARRAY()
If UBound(i) = -1 Then INIT_ARRAY
REM i() = Array(Array(1,2,3),Array(7,8,9)) funktioniert nicht!!
REM i(0,0) = 1
REM i(1,0) = 7
	MsgBox "(0,0): "&Str(i(0,0))&Chr(13)&"(0,1): "&Str(i(0,1))&Chr(13)&"(0,2): "&Str(i(0,2))&Chr(13)&"(1,0): "&Str(i(1,0))&Chr(13)&"(1,1): "&Str(i(1,1))&Chr(13)&"(1,2): "&Str(i(1,2))
End Function
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Lookup-table, Mehrdimensionales Array deklarieren

Beitrag von DPunch »

Aloha
Gast hat geschrieben:das mit dem UBound geht nicht
Wie kommst Du auf das schmale Brett?
saxo
**
Beiträge: 48
Registriert: Do, 01.04.2010 00:45

Re: Lookup-table, Mehrdimensionales Array deklarieren

Beitrag von saxo »

Hab ubound ausprobiert, verstehe aber auch nicht ganz wie es funktionieren soll. Wenn das array deklariert wird, wird es ja schon automatisch mit 0 gefüllt, also ist ubound schon nicht mehr -1. Vielleicht kann man es ohne Grössenangabe deklarieren und dann in init() redimmen. Dann sollte ubound funktionieren.
Grüsse
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Lookup-table, Mehrdimensionales Array deklarieren

Beitrag von Stephan »

Wenn das array deklariert wird, wird es ja schon automatisch mit 0 gefüllt
das ist im von DPunch geposteten Code nicht der Fall, denn dort steht:

Code: Alles auswählen

Global i() As Single
Vielleicht kann man es ohne Grössenangabe deklarieren
GENAU DAS GESCHIEHT!


WARUM eigerntlich probierst Du nicht den geposteten Code ersteinmal aus bevor Duz hier offensichtlich falsche Aussagen triffst?



Gruß
Stephan
Antworten