While schleife wird ignoriert

10/09/2013 15:50 SpieleHacksInfo#1
Ich habe ein Problem und zwar, dass meine While Schleife zwei mal durch geführt und dann ignoriert bzw. das Script beendet wird. Ich bin atm. am verzweifeln und würde mich über eine hilfreiche Antwort freuen.
Und der Code da unten ist nur ein Snippet eigtl. soll VIEL mehr in der Schleife stehen. Ich habe eine alternativ Lösung für das Problem trotzdem würde ich gerne Wissen warum er da einfach "abhaut".
Code:
#RequireAdmin
#include <NomadMemory.au3>
#include <Array.au3>
Dim $x[99]
Dim $y[99]
Dim $z[99]
Dim $addier[99]
Dim $sum[99]
$base = 0x2330388
$pid = ProcessExists("t6zm.exe")
$handle = _MemoryOpen($pid)
While 1
	$playz = _MemoryRead( 0x2E490D58, $handle, "float")
$playy = _MemoryRead( 0x2E490D54, $handle, "float")
$playx = _MemoryRead( 0x2E490D50, $handle, "float")

$numofz = _MemoryRead($base,$handle);,"byte[4]")
;MsgBox(0,"",$numofz)
$base = $base + 0x44
For $i = 1 To $numofz
	$x[$i] = _MemoryRead($base,$handle,"float")
	$ybase = $base + 0x4
	$y[$i] =  _MemoryRead($ybase,$handle,"float")
	$zbase =  $ybase + 0x4
	$z[$i] =  _MemoryRead($zbase,$handle,"float")
    $base = $base + 0x30
	$i = $i + 1
	$x[$i] = _MemoryRead($base,$handle, "float")
	$ybase = $base + 0x4
	$y[$i] = _MemoryRead($ybase,$handle, "float")
	$zbase =  $ybase + 0x4
	$z[$i] = _MemoryRead($zbase,$handle, "float")
	$base = $base + 0x5C
Next
Sleep(500)
WEnd
//edit: Gerade als Funktion ausprobiert. Nach 2x benutzen beendet das Script wie in der Schleife.:(
10/09/2013 15:57 alpines#2
Wenn der aus der Schleife "abhaut", dann liegt das wohl daran das du einen _MemoryRead falsch angewendet hast, poste doch mal den Fehler der in SciTE angezeigt wird, sonst können wir dir nicht helfen, oder du hast einfach die Arraygröße überschritten.
10/09/2013 15:59 SpieleHacksInfo#3
Nope. Es gibt keinen Fehler.

Code:
>"C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "C:\Users\SHI\Desktop\whynot.au3" /UserParams    
+>15:54:43 Starting AutoIt3Wrapper v.2.1.2.9    Environment(Language:0407  Keyboard:00000407  OS:WIN_8/  CPU:X64 OS:X64)
>Running AU3Check (1.54.22.0)  from:C:\Program Files (x86)\AutoIt3
+>15:54:43 AU3Check ended.rc:0
>Running:(3.3.8.1):C:\Program Files (x86)\AutoIt3\autoit3.exe "C:\Users\SHI\Desktop\whynot.au3"    
--> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop
Das alles steht nach beenden darin.
10/09/2013 16:05 alpines#4
Es liegt vielleicht an einem anderen Teil des Codes, so ein kleines Snippet bringt einen auch nicht weiter.
10/09/2013 16:09 SpieleHacksInfo#5
Kann nicht sein. Dieser Code alleine stürzt ab bzw. beendet nach 2 mal.
10/09/2013 20:02 KDeluxe#6
Code:
#AutoIt3Wrapper_UseX64 = n

#RequireAdmin
#include <KDMemory.au3>

Dim $x, $y, $z
Dim $handles = 0, $processName = "t6zm.exe"

While True
    $processId = ProcessExists($processName)
    If $processId == 0 Then
        If IsArray($handles) Then
            _KDMemory_CloseHandles($handles)
            $handles = 0
        EndIf
    Else
        If $handles == 0 Then
            $handles = _KDMemory_OpenProcess($processId)
            If @error Then
                ;MsgBox()
                ContinueLoop
            EndIf
        EndIf

        $base = 0x2330388
        $count = _KDMemory_ReadProcessMemory($handles, $base, "DWORD")

        ReDim $x[$count]
        ReDim $y[$count]
        ReDim $z[$count]

        $base += 0x44
        For $i = 0 To $count - 1
            $x[$i] = _KDMemory_ReadProcessMemory($handles, $base, "float")
            $base2 = $base + 0x04
            $y[$i] = _KDMemory_ReadProcessMemory($handles, $base2, "float")
            $base2 += 0x04
            $z[$i] = _KDMemory_ReadProcessMemory($handles, $base2, "float")

            $i += 1
            If $i >= $count Then ExitLoop

            $base += 0x30
            $x[$i] = _KDMemory_ReadProcessMemory($handles, $base, "float")
            $base2 = $base + 0x04
            $y[$i] = _KDMemory_ReadProcessMemory($handles, $base2, "float")
            $base2 += 0x04
            $z[$i] = _KDMemory_ReadProcessMemory($handles, $base2, "float")

            $base += 0x5C
        Next
        ;_ArrayDisplay()
    EndIf
    Sleep(500)
WEnd
Ich spar es mir an dieser Stelle mal alle Änderungen zu nennen. Kann es aber gerne noch machen, sofern gewünscht.
10/09/2013 20:04 SpieleHacksInfo#7
Danke sehr lieb von dir. Ich sehe die Änderungen schon. :D
Ich schau gleich mal nach.
//edit: geht leider doch nicht
10/09/2013 20:42 lolkop#8
es ist absolut NICHT möglich, das das von dir gepostete tool nach 2 durchläufen aus der schleife springt (zumindest ohne error), da es keinerlei abbruchbedingungen in der schleife gibt.

wahrscheinlichste fehlerursache in deinem script ist ein zu hoher array index, da du in keinem fall auf den maximalen index prüfst.
10/09/2013 21:00 SpieleHacksInfo#9
Ich bekomme es einfach nicht hin. Ich weiss, dass es eigtl. nicht möglich ist. -.-
Bei meinem komplettem Code beendet er schon vor vollständigem Durchlauf.

Code:
#RequireAdmin
#include <Array.au3>
#include <NomadMemory.au3>

$base = 0x2330388
$pid = ProcessExists("t6zm.exe")
$handle = _MemoryOpen($pid)
HotKeySet("{Numpad0}","aim")


While 1
Sleep(1000)
WEnd





Func aim()
	MsgBox(0,"","aim")
	$playz = _MemoryRead( 0x2E490D58, $handle, "float")
$playy = _MemoryRead( 0x2E490D54, $handle, "float")
$playx = _MemoryRead( 0x2E490D50, $handle, "float")

$numofz = _MemoryRead($base,$handle)
	$base = $base + 0x44
	Dim $x[$numofz]
Dim $y[$numofz]
Dim $z[$numofz]
Dim $addier[$numofz]
Dim $sum[$numofz]
For $i = 1 To $numofz
	$x[$i] = _MemoryRead($base,$handle,"float")
	$ybase = $base + 0x4
	$y[$i] =  _MemoryRead($ybase,$handle,"float")
	$zbase =  $ybase + 0x4
	$z[$i] =  _MemoryRead($zbase,$handle,"float")
    $base = $base + 0x30
	$i = $i + 1
	$x[$i] = _MemoryRead($base,$handle, "float")
	$ybase = $base + 0x4
	$y[$i] = _MemoryRead($ybase,$handle, "float")
	$zbase =  $ybase + 0x4
	$z[$i] = _MemoryRead($zbase,$handle, "float")
	$base = $base + 0x5C
Next

;_ArrayDisplay($x)
;_ArrayDisplay($y)
;_ArrayDisplay($z)

For $i = 1 To $numofz
	$addier[$i] = $x[$i] + $y[$i]
Next

;_ArrayDisplay($addier)
$playaddier = $playx + $playy
;near
$near = 0
For $i = 1 To $numofz
$sum[$i] = $addier[$i] - $playaddier
Next
For $i = 1 To $numofz
	If $near > $sum[$i] Then
		$near = $sum[$i]
		$numofnear = $i
	EndIf
Next
$mx = _MemoryRead(0x2D3EFB40, $handle, "float")
$my = _MemoryRead(0x2D3EFB3C, $handle, "float") ;höhe
$zw1y = $my / 360
$zw1x = $mx / 180
$zw2y = $zw1y * $y[$numofnear]
$zw2x = $zw1x * $x[$numofnear]
_MemoryWrite(0x2D3EFB40, $handle, $zw2x, "float")
_MemoryWrite(0x2D3EFB3C, $handle, $zw2y, "float")
MsgBox(0,"","aimed")
EndFunc
Ich musste meinen Pc letztens neu aufsetzen und habe Autoit komplett neu heruntergeladen.
10/09/2013 21:41 alpines#10
Du kannst den Sleep auf 100ms reduzieren.
Strukturier mal deinen Code besser, da erkennt man ja gar nichts.

Setz am besten in jede Zeile deiner Funktion eine MsgBox mit einer bestimmten Zahl, wenn keine MsgBox mehr angezeigt wird, weist du welche Funktion dein Script rauskickt.
10/09/2013 23:10 SpieleHacksInfo#11
Sooooo die Lösung. Als erstes möchte ich mich sehr sehr sehr bei KDeluxe bedanken.

Das Problem war, dass wie er in seinem Skript schon gezeigt hatte fängt eine Matrix bzw. ein Array ja bei 0 an zu zählen und $i fängt ja leider nach meiner Definition bei 1 an also ist die Lösung bei jedem For $i = 1 To $numofz. Das ganze so zu ersetzen. For $i = 0 To $numofz. Interessant, dass das bei der Autoit Console nicht als Fehler angezeigt wird.
10/09/2013 23:13 lolkop#12
Quote:
Originally Posted by SpieleHacksInfo View Post
Sooooo die Lösung. Als erstes möchte ich mich sehr sehr sehr bei KDeluxe bedanken.

Das Problem war, dass wie er in seinem Skript schon gezeigt hatte fängt eine Matrix bzw. ein Array ja bei 0 an zu zählen und $i fängt ja leider nach meiner Definition bei 1 an also ist die Lösung bei jedem For $i = 1 To $numofz. Das ganze so zu ersetzen. For $i = 0 To $numofz. Interessant, dass das bei der Autoit Console nicht als Fehler angezeigt wird.
das ist kein grund für das script vorzeitig zu enden... frühzeitiges ende durch fehler kann nur bei überschreitung der arraydimension auftauchen...

ein ende des scriptes ohne fehler ist in deinem fall in keinem falle möglich...
10/09/2013 23:16 SpieleHacksInfo#13
Quote:
Originally Posted by lolkop View Post
das ist kein grund für das script vorzeitig zu enden... frühzeitiges ende durch fehler kann nur bei überschreitung der arraydimension auftauchen...

ein ende des scriptes ohne fehler ist in deinem fall in keinem falle möglich...
Komischer Weise lief es so bis gerade eben. Jetzt läuft er wieder nur noch einmal durch. -.- Trotzdem danke an alle die mir geholfen haben.
10/10/2013 00:14 lolkop#14
Quote:
Originally Posted by SpieleHacksInfo View Post
Code:
Dim $x[$numofz]
Dim $y[$numofz]
Dim $z[$numofz]
For $i = 1 To $numofz
	[...]
	$i = $i + 1
	$x[$i] = _MemoryRead($base,$handle, "float")
	$ybase = $base + 0x4
	$y[$i] = _MemoryRead($ybase,$handle, "float")
	$zbase =  $ybase + 0x4
	$z[$i] = _MemoryRead($zbase,$handle, "float")
	$base = $base + 0x5C
Next
eigentlich ist ganz klar was hier passiert...

du deklarierst drei arrays der größe $numofz... dementsprechend ist das letzte element der arrays $array[$numofz-1]. deine schleife hingegen läuft bis $numofz. ist dieser letzte schritt erreicht, so inkrementierst du den index sogar nochmals und kommst so auf $x[$numofz+1] womit die arraygröße sogar um 2 überschritten wird....

abstürzen tut das ganze aber schon bei $i=$numofz-1 da hier das inkrementieren bereits zu einer überschreitung der maximalen größe führt....
10/10/2013 00:30 alpines#15
Er meinte aber, das das Script ohne Fehler durchläuft.
Das kann aber nicht stimmen wenn es wegen der Arraygröße abstürzt.