Seite 1 von 1
Lookup-table, Mehrdimensionales Array deklarieren
Verfasst: Fr, 21.10.2011 23:55
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?
Re: Lookup-table, Mehrdimensionales Array deklarieren
Verfasst: Sa, 22.10.2011 07:05
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
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
Re: Lookup-table, Mehrdimensionales Array deklarieren
Verfasst: So, 23.10.2011 21:55
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??
Re: Lookup-table, Mehrdimensionales Array deklarieren
Verfasst: So, 23.10.2011 23:24
von gogo
Du kannst ja am Beginn der Sub prüfen ob was im Array drinsteht - wenn ja: Befüllen nicht notwendig etc.
g
Re: Lookup-table, Mehrdimensionales Array deklarieren
Verfasst: Mo, 24.10.2011 04:47
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:
Gruß
Stephan
Re: Lookup-table, Mehrdimensionales Array deklarieren
Verfasst: Mo, 24.10.2011 05:40
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
Re: Lookup-table, Mehrdimensionales Array deklarieren
Verfasst: Mo, 24.10.2011 06:38
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
Re: Lookup-table, Mehrdimensionales Array deklarieren
Verfasst: Mo, 24.10.2011 17:00
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
Re: Lookup-table, Mehrdimensionales Array deklarieren
Verfasst: Mo, 24.10.2011 23:36
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?
Re: Lookup-table, Mehrdimensionales Array deklarieren
Verfasst: Di, 25.10.2011 01:47
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
Re: Lookup-table, Mehrdimensionales Array deklarieren
Verfasst: Di, 25.10.2011 06:57
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
Re: Lookup-table, Mehrdimensionales Array deklarieren
Verfasst: Di, 25.10.2011 11:41
von DPunch
Aloha
Gast hat geschrieben:das mit dem UBound geht nicht
Wie kommst Du auf das schmale Brett?
Re: Lookup-table, Mehrdimensionales Array deklarieren
Verfasst: Di, 25.10.2011 23:06
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
Re: Lookup-table, Mehrdimensionales Array deklarieren
Verfasst: Mi, 26.10.2011 00:27
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:
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