hi,
wollt fragen wie ich eine endlos funktions machen kann,
also so viel parameter eingeben kann wie ich will.
Und diese dann auch wieder auslesen?
endlos funktion
-
- [ offen ]
-
AutoItfreak -
30. Mai 2012 um 18:00 -
Geschlossen -
Erledigt
-
-
Geht nicht in AutoIt. Musst wenn dann ein Array bzw DllStruct übergeben und diesen dann immer auswerten. Damit kannst du Variable Anzahl der "Parameter" machen und dann ein Array wieder returnen.
-
Eventuell kannst du das Array dann auch als ByRef Parameter übergeben. Das erhöht (besonders bei großen Arrays) die Geschwindigkeit des Funktionsaufrufs.
Dabei musst du allerdings beachten, dass alle Änderungen die du am Array innnerhalb der Funktion machst auch beim Array außerhalb der Funktion erscheinen, denn es handelt sich um das selbe Array.
Wenn du das Array als normalen Parameter übergibst, wird eine lokale Kopie des Arrays für die Funktion erstellt, und es werden keine Änderungen außerhalb der Funktion übernommen.
BitOR, BitAND und wie sie alle heißen, können nur eine (fast) beliebige Anzahl von Parametern übernehmen, weil sie interne AutoIt Funktionen sind. Die werden komplett anders interpretiert als in AutoIt geschriebene Funktionen. -
Machs doch mit Arrays, kannste zwar nicht unenendlich viele Parameter machen, aber über ne Million bestimmt.
[autoit];...
[/autoit]
Global $Parameter[100]
$Parameter[0] = "Hallo"
$Parameter[1] = "wie"
$Parameter[2] = "geht"
$Parameter[3] = "es"
$Parameter[4] = "euch"
;...
func _MeineFunk($Parameter)
; Verwendung von $Parameter
EndFunc
so inetwa.mfg
Hauke -
Zitat
Machs doch mit Arrays, kannste zwar nicht unenendlich viele Parameter machen, aber über ne Million bestimmt.
Das wurde doch schon 2 mal gepostet ?(.
Und um genau zu sein sind es: "Arrays: A maximum of 64 dimensions and/or a total of 16 million elements" also theoretisch kannst du 1.6x10⁷ Parameter per Array übergeben. Mit mehreren Dimensionen natürlich noch viel mehr. Allerdings geht dir da irgendwann der Arbeitsspeicher aus. -
oh sry. War n bisschen unter zeitdruck und wollt noch eben posten.
mfg
Hauke -
ja aber in dieser funktion übergebe ich schon fünf arrays
und ich will aber das der benutzer noch mehr hinzufügen kann -
Zitat
ja aber in dieser funktion übergebe ich schon fünf arrays
und ich will aber das der benutzer noch mehr hinzufügen kann
Das ist ja schön und gut, aber leider nicht möglich in AutoIt. Zumindest nicht so wie du es in deinem ersten Post erklärt hast.
Wie ist diese Funktion denn aufgebaut? Wie sehen die Arrays aus die bereits Parameter sind? Wie viele Dimensionen haben sie? Ich bin mir sicher, dass wir da irgendwas basteln können.
Vermutlich am ehesten mit einem multidimensionalen Array. -
Vermutlich am ehesten mit einem multidimensionalen Array.
[autoit]
Nicht zwingend; In AutoIt kann ein Array ja auch andere Arrays beinhalten, Beispiel:
[/autoit]
Dim $array1[5] = [1, 2, 3, 4, 5]
Dim $array2[3] = [6, 7, 8]
Dim $BigArray[2] = [$array1, $array2]So lassen sich vielleicht komplexere Umformungen in Multidimensionale Arrays vermeiden...
-
Zitat
So lassen sich vielleicht komplexere Umformungen in Multidimensionale Arrays vermeiden...
Ich versteh nicht was daran komplexer sein soll... Das kommt fast auf das selbe raus, nur muss man bei deiner Methode vorher noch das Element des ersten Arrays in eine Variable speichern bevor man an das darin enthaltene Array rankommt.
Die einzige Ausnahme ist natürlich wenn die Arrays verschieden viele Elemente haben. Dann wird es mit multidimensionalen Arrays schwierig. Aber das kommt darauf an was genau AutoItFreak machen will.
Erleuchte uns AutoItFreak ;). Sonst können wir hier nur wild spekulieren. -
Ich hatte das so verstanden, dass eine unbestimmte Anzahl unterschiedlich großer Arrays (auch evtl. mit unterschiedlich vielen Dimensionen) übergeben werden sollen, bzw. hab ich das so (fehl-) interpretiert . Da dachte ich mir, dass es vielleicht schwierig werden könnte, dass alles in ein Array zu bugsieren, da man hier wohl auch rekursiv arbeiten muss/kann/sollte/was auch immer.
Gruß stay
-
Genau das will er doch aber auch stayawayknight
-
Zitat
Genau das will er doch aber auch stayawayknight
Er sagt nur, dass er 5 Arrays bereits als Parameter hat... Aber wenn die verschiedene Größen/Dimensionen haben ist stayawayknights Vorschlag natürlich besser geeignet. -
Er will im Grunde eine Anzahl X an Parameter mit scheinbar zufälligem Typ an eine Funktion übergeben.
Sprich z.b. 100 Paramter davon 20 Arrays, 60 String und 20 Integer.
Also um es mal anders zu sagen totaler Murks.
So wie es im Starpost sich ließt will er eine Funktion als Datenbank missbrauchen.
-
Also Nochmal
sorry vieleicht hab i mich auch zu kompliziert ausgedrückt
so soll die funktion aussehen:
[autoit]Func _objects($object1, $object2, $object3, $object4, $object5, ...)
[/autoit]Dies sind alle 1-dimensional arrays die dort übergeben werden
Der sinn dabei ist das alle objekte(so viele wie der user erstellt hat)
zu einer 2-dimensionallen array zusammengefügt werden -
Wieso übergibst du nicht einfach ein eindimensionales Array mit eindimensionalen Arrays...? Wäre doch ganz einfach.
-
ja jedoch müsste man dies dann manuel ohne diese funktion machen
-
Ich hab mal ne fertige Funktion aus $vars Vorschlag geschrieben, auch wenn ich das Vorhaben für wenig sinnvoll halte...
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]$iArrayCount = Random(1, 5, 1)
[/autoit] [autoit][/autoit] [autoit]
$iArraySize = 8
MsgBox(64, "Info", "Nr. of Arrays: " & $iArrayCount)
Dim $aArrays[$iArrayCount]
For $i = 0 To $iArrayCount - 1
Dim $aTemp[$iArraySize]
For $j = 0 To $iArraySize - 1
$aTemp[$j] = Random(0, 100, 1)
Next
_ArrayDisplay($aTemp, "Array Nr. " & $i + 1)
$aArrays[$i] = $aTemp
Next
$aTemp = ""$aNewArray = _ConcatenateArrays($aArrays)
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($aNewArray, "New 2D Array")Func _ConcatenateArrays(ByRef $av_Arrays)
[/autoit]
; -Author: name22 (http://www.autoit.de)
Local $iCount = UBound($av_Arrays)
Local $aTempArray = $aArrays[0]
Local $aReturn[$iCount][UBound($aTempArray)]
For $i = 0 To $iCount -1
$aTempArray = $av_Arrays[$i]
For $j = 0 To UBound($aTempArray) -1
$aReturn[$i][$j] = $aTempArray[$j]
Next
Next
Return $aReturn
EndFunc
Die Arrays müssen aber hier selbstverständlich die selbe Anzahl an Elementen haben, da du sie in ein 2D Array packen willst.
Was spricht denn dagegen das manuell zu machen? Wenn du uns nichts über dein Vorhaben erzählst, dann brauchst du dich auch nicht wundern wenn wir hier nicht vorankommen. -
Also Nochmal
sorry vieleicht hab i mich auch zu kompliziert ausgedrückt
so soll die funktion aussehen:
[autoit]Func _objects($object1, $object2, $object3, $object4, $object5, ...)
[/autoit]Dies sind alle 1-dimensional arrays die dort übergeben werden
Der sinn dabei ist das alle objekte(so viele wie der user erstellt hat)
zu einer 2-dimensionallen array zusammengefügt werdenHab zwar immernoch nicht verstanden was du da nun genau tun willst und warum, aber nochmals zusammengefasst:
Dein Anwender kann Objekte erstellen, dessen Attribute (Position, Farbe und Größe ????) in einem jeweiligen Array gespeichert sind. Nun willst du alle Objekte in ein 2D Array überführen.
Da stell ich mir einfach die Frage warum du die Objekte nicht gleich in ein 2D Array speicherst. Was für Objekte sind das, und wie werden sie erstellt? Ich versteh nicht wofür man eine derartige Funktion brauchen sollte.Davon ab... man muss ja nicht zwingend alle vorhandenen Objekte in einem Rutsch in das 2D Array einfügen. Warum schreibst du nicht eine Funktion wie diese hier:
[autoit]func _addObjectTo2dArray($2dArray,$object)
[/autoit]