Lookup-table, Mehrdimensionales Array deklarieren

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Lookup-table, Mehrdimensionales Array deklarieren

Re: Lookup-table, Mehrdimensionales Array deklarieren

von Stephan » Mi, 26.10.2011 00:27

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

Re: Lookup-table, Mehrdimensionales Array deklarieren

von saxo » Di, 25.10.2011 23:06

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

von DPunch » Di, 25.10.2011 11:41

Aloha
Gast hat geschrieben:das mit dem UBound geht nicht
Wie kommst Du auf das schmale Brett?

Re: Lookup-table, Mehrdimensionales Array deklarieren

von DPunch » Di, 25.10.2011 06:57

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

von gogo » Di, 25.10.2011 01:47

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

von saxo » Mo, 24.10.2011 23:36

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) 86-mal heruntergeladen

Re: Lookup-table, Mehrdimensionales Array deklarieren

von F3K Total » Mo, 24.10.2011 17:00

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

von Stephan » Mo, 24.10.2011 06:38

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

von F3K Total » Mo, 24.10.2011 05:40

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

von Stephan » Mo, 24.10.2011 04:47

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

Re: Lookup-table, Mehrdimensionales Array deklarieren

von gogo » So, 23.10.2011 23:24

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

von saxo » So, 23.10.2011 21:55

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

von F3K Total » Sa, 22.10.2011 07:05

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

Lookup-table, Mehrdimensionales Array deklarieren

von saxo » Fr, 21.10.2011 23:55

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?

Nach oben