Lookup-table, Mehrdimensionales Array deklarieren
Moderator: Moderatoren
Lookup-table, Mehrdimensionales Array deklarieren
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?
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
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
Gruß R
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
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
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 11: AOO, LO Linux Mint: AOO, LO
Re: Lookup-table, Mehrdimensionales Array deklarieren
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??
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
Du kannst ja am Beginn der Sub prüfen ob was im Array drinsteht - wenn ja: Befüllen nicht notwendig etc.
g
g
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
Re: Lookup-table, Mehrdimensionales Array deklarieren
Nein, wieso denn?wenn ich das richtig vertehe müsste dann jeder user der mein Programm verwendet den Funktionsaufruf in Calc eintragen (in Extras-Anpassen-Ereignisse)
Die arrays sind schlecht dokumentiert.
Wieso?
,Irgendwo habe ich noch das gelesen
Wo?
Bei mir auch nicht, zumal ich nicht wüßte wieso ein Ausdruck wie "_Array(7,8,9)" überhaupt funktionieren sollte.funktioniert aber bei mir nicht
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
Re: Lookup-table, Mehrdimensionales Array deklarieren
Moin,
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
ja, das klappt auch bei mir, aber nur wenn ich diese Zeile in die Prozedur schreibe.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))
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
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 11: AOO, LO Linux Mint: AOO, LO
Re: Lookup-table, Mehrdimensionales Array deklarieren
NeinMache ich was falsch?
Die schien aber doch durch Deinen post längst beantwortet?Die Frage war:
Wie fülle ich ein Array einmalig, nicht bei jedem Prozeduraufruf?
Also davon weiß ich dann nichts. Ich lese jedenfalls nur:Erschwerend kommt hinzu, das Dokumentereignisse nicht verwendet werden sollen.
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.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.
Gruß
Stephan
Re: Lookup-table, Mehrdimensionales Array deklarieren
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
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
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 11: AOO, LO Linux Mint: AOO, LO
Re: Lookup-table, Mehrdimensionales Array deklarieren
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?
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
Re: Lookup-table, Mehrdimensionales Array deklarieren
Das Laden des Dokuments ist erst NACH der Berechnung der Zellen abgeschlossen - das Array wird also ausgewertet bevor es befüllt wurde.
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
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
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
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
Re: Lookup-table, Mehrdimensionales Array deklarieren
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.
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
Aloha
Wie kommst Du auf das schmale Brett?Gast hat geschrieben:das mit dem UBound geht nicht
Re: Lookup-table, Mehrdimensionales Array deklarieren
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
Grüsse
Re: Lookup-table, Mehrdimensionales Array deklarieren
das ist im von DPunch geposteten Code nicht der Fall, denn dort steht:Wenn das array deklariert wird, wird es ja schon automatisch mit 0 gefüllt
Code: Alles auswählen
Global i() As Single
GENAU DAS GESCHIEHT!Vielleicht kann man es ohne Grössenangabe deklarieren
WARUM eigerntlich probierst Du nicht den geposteten Code ersteinmal aus bevor Duz hier offensichtlich falsche Aussagen triffst?
Gruß
Stephan