Tratsch rund um Autoit / Autoit Talk | kleinere Fragen

05/07/2013 17:13 YatoDev#1186
Code:
$random = Random(1,30,1)

_FFFormOptionSelect("date", "id", $random, "value")
Random(1,30,1)

damit er keine komma zahlen generiert
05/07/2013 17:15 Der-Eddy#1187
Setz mal den Flag auf 1
sonst generiert Random eine Float Zahl mit der er vielleicht nicht umgehen kann

[Only registered and activated users can see links. Click Here To Register...]
05/08/2013 21:14 Achat#1188
Jemand eine Idee, wie ich diesen Code hier
Code:
If $i > z Then
	Do
	$i -= z
	Until $i < z
EndIf
ohne die Do-Until Schleife schreiben kann?

Wenn i größer als z, dann ziehe von i so lange z ab, bis i kleiner z.


MfG
05/08/2013 21:24 Requi#1189
Bitte nicht hauen :o

Code:
While $i > z
$i -= z
Wend
Keine Ahnung ob von Logik richtig
05/08/2013 21:25 -STORM-#1190
Code:
If $i > z Then
	While 1
		$i -= z
		If $i < z Then ExitLoop
	WEnd
EndIf
oder
Code:
If $i > z Then
	While $i >= z
		$i -= z
	WEnd
EndIf

Edit - Alternativer Mindfuck:
Code:
If $i > z Then
	For $i = 0 To 1 + Floor(($i-z)/z) ;// Floor in AutoIt nicht zwingend notwendig, da "For $i = 0 to 0.x" einmal ausgeführt wird. Logisch betrachtet kann aber nur xmal mit ganzem x ausgeführt werden.
		$i -= z
	Next
EndIf
Ich nehme an, ohne Herleitung ist das nicht verständlich?
05/08/2013 21:37 Achat#1191
Quote:
Originally Posted by Requι View Post
Bitte nicht hauen :o

Code:
While $i > z
$i -= z
Wend
Keine Ahnung ob von Logik richtig
Quote:
Originally Posted by -STORM- View Post
Code:
If $i > z Then
	While 1
		$i -= z
		If $i < z Then ExitLoop
	WEnd
EndIf
oder
Code:
If $i > z Then
	While $i >= z
		$i -= z
	WEnd
EndIf
Edit - Alternativer Mindfuck:
Code:
If $i > z Then
	For $i = 0 To 1 + ($i-z)/z
		$i -= z
	Next
EndIf
Dann hab ich aber immer noch Schleifen. Das hätte ich dazu schreiben sollen: Wen möglich, möchte ich ganz auf Schleifen verzichten, da viele Schleifendurchläufe einfach langsam sind.

Trotzdem danke für eure Antworten.

MfG
05/08/2013 21:41 butter123#1192
wie willst du mehrere gleiche aktionen hintereinander ausführen ohne schleife?
If $i>z then
$i = z
endif

willste ja warscheinlich nicht :D
05/08/2013 21:49 omer36#1193
willst du zwischendrinn mit den variablen arbeiten, oder zählt nur das endergebnis?

PHP Code:
If $i $z Then
    $i 
$i - ($z * (Ceiling($i/$z)))
EndIf 
05/08/2013 21:49 Requi#1194
Das würde ja eig gehen :D
Code:
If $i > z Then
$i = z
$i -= z
EndIf
Schon hast du $i < z
05/08/2013 21:52 butter123#1195
was ist genau dein ziel?
i < z und die differenz von i zu z ist auch wichtig?

edit:
k = mod(i,z)
i=i-(z-k)
kommt zum selben ergebnis wie die schleife
05/08/2013 21:57 -STORM-#1196
Ganz ohne Schleifen kann man in AutoIt nichts wiederholen. Da bräuchte man ne jump/goto Anweisung, was nebenbei ziemlich unübersichtlich wird.
Wenn in der Schleife außer der Subraktion nichts anderes stehen soll, kann man die allerdings die Rechnung zusammenfassen.
Quote:
Originally Posted by butter123 View Post
If $i>z then
$i = z
endif
Liefert nur dasselbe Ergebnis, wenn $i ein ganzzahliges vielfaches von z ist.
Vom Prinzip her aber richtig gedacht.

Quote:
Originally Posted by Requι View Post
Das würde ja eig gehen :D
Code:
If $i > z Then
$i = z
$i -= z
EndIf
Schon hast du $i < z
Auch nicht gleichbedeutend, das ergibt $i =0.


Dasselbe Ergebnis erhält man wie folgt:
Wird z von $i sooft abgezogen, bis $i gleich z ist, braucht es ($i-z)/z Durchgänge (theoretisch halt; praktisch ist nur eine ganzzahlige Anzahl an Durchgängen möglich).
Damit $i kleiner als z ist, ist also ein Vorgang mehr nötig, also Floor(($i-z)/z)+1 Vorgänge.
Zieht man sooft z von $i ab, ergibt das:
Code:
$i -= z*(Floor(($i-z)/z)+1)
Somit braucht man keine Schleife und spart Rechenpower.


Edit:
Quote:
Originally Posted by omer36 View Post
willst du zwischendrinn mit den variablen arbeiten, oder zählt nur das endergebnis?

PHP Code:
If $i $z Then
    $i 
$i - ($z * (Ceiling($i/$z)))
EndIf 
Am nächsten dran, jedoch ist Ceiling(x) nicht gleich Floor(x)+1, da ganzzahlige x nicht aufgerundet werden, sondern gleich bleiben.
Außerdem ist das x hier nicht $i/z, sondern ($i-z)/z.
Nach deinem Code wird im übertragenen Sinne die Schleife wiederholt, bis $i = 0 ist (also $i/z mal) bzw. bis $i = -z ist (für nicht ganzzahliges $i/z wegen Ceiling). Damit es nur wiederholt wird, bis $i < z ist, sind ($i-z)/z Durchgänge nötig.
05/08/2013 22:11 omer36#1197
PHP Code:
If $i $z Then
    MsgBox
("","",_r($i$z))
EndIf


Func _r($i$z)
    
$i -= $z
    
If $i $z Then Return $i
    
Return _r($i$z)
EndFunc 
vllt. gehts ja mit ner rekursiven funktion schneller als mit einer schleife,
kannst ja mal testen.


joa, hatte wohl nen denkfehler,
05/08/2013 22:12 butter123#1198
ich denke floor und mod sollten trotzdem noch schneller sein
05/08/2013 22:13 -STORM-#1199
Quote:
Originally Posted by butter123 View Post
edit:
k = mod(i,z)
i=i-(z-k)
kommt zum selben ergebnis wie die schleife
Könntest du erklären, wie du darauf gekommen bist?
Ausprobieren? Ich glaube nicht, dass das für alle i und z funktioniert.

Mod(i,z) gibt nur den Rest von i/z wieder.

Edit: Wieso bin ich da nicht drauf gekommen:
Code:
$i -= z*(Floor(($i-z)/z)+1)
gleichbedeutend mit
Code:
$i = Mod($i,z)
Wobei meine erste tolle Lösung natürlich total umständlich ist. :/
05/08/2013 22:20 Achat#1200
Quote:
Originally Posted by omer36 View Post
willst du zwischendrinn mit den variablen arbeiten, oder zählt nur das endergebnis?

PHP Code:
If $i $z Then
    $i 
$i - ($z * (Ceiling($i/$z)))
EndIf 
Danke!

Mit floor und abs konnte ich die Ausführung meines Scripts um 246% erhöhen und das nur durch das ersetzen der Schleife...
Bei Ceiling kann i negativ werden. da ja z.B. Ceiling(201/100) 3 ergibt.
Bei Floor wird es auf jeden Fall positiv.

Quote:
Originally Posted by Requι View Post
Das würde ja eig gehen :D
Code:
If $i > z Then
$i = z
$i -= z
EndIf
Schon hast du $i < z
Da wären meine Bedingungen aber nicht erfüllt. Das von i z abgezogen werden soll.

MfG