1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Andy

Beiträge von Andy

  • Alles gute zum 26'ten, chip

    • Andy
    • 19. Februar 2013 um 17:24

    Glücklichen Herzwunsch und alles Gute!

  • Diese AHK Funktion in AutoIt

    • Andy
    • 18. Februar 2013 um 19:50

    urgs....Fehler meinerseits^^
    Ich hatte die 0.8.1 downgeloadet, da die 8.2 nicht online war....und mit der 0.8.1 sollte alles funktionieren

  • Diese AHK Funktion in AutoIt

    • Andy
    • 18. Februar 2013 um 19:27
    [autoit]

    #AutoIt3Wrapper_usex64=n
    $dll = DllOpen("API.dll")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $dll = ' & $dll & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit][autoit][/autoit][autoit]

    $ret = DllCall($dll, "uint:cdecl", "API_GetScreenSizeX");, "int", 0x123456, "str", "Text")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    _arraydisplay($ret)

    [/autoit]

    zuerst muss die dll geöffnet werden, ansonsten passiert garnichts....
    Hast du #AutoIt3Wrapper_usex64=n definitiv in deinem Script?

  • String teilen | StringReplace

    • Andy
    • 18. Februar 2013 um 19:15

    Freunde der Nacht....wie soll denn StringReplace() funktionieren, wenn die falschen Variablen verwendet werden?

    [autoit]

    Global $String = "Test1 – TEst2"
    Local $text2 = StringReplace($String, '–', "-",1,0) ; Hier 4. Parameter 0 (siehe Hilfe)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $text2 = ' & $text2 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]
  • Diese AHK Funktion in AutoIt

    • Andy
    • 18. Februar 2013 um 19:10

    Hi,

    Zitat

    Also poste bei derartigen Anfragen dein BS und ob 32- oder 64Bit-System.

    6. setzen....

    Ich wette auf ein 64Bit BS, daher wäre es sinnvoll

    [autoit]

    #AutoIt3Wrapper_usex64=n

    [/autoit]

    als oberste Zeile in dein script zu setzen, die Dll ist eine 32Bit!

    [autoit]

    $dll = DllOpen("API.dll")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $dll = ' & $dll & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit][autoit][/autoit][autoit]

    $ret = DllCall($dll, "uint:cdecl", "API_GetScreenSizeX");, "int", 0x123456, "str", "Text")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    _arraydisplay($ret)
    $ret = DllCall($dll, "uint:cdecl", "API_AddChatMessage", "int", 0xFF123456, "str", "Text")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    _arraydisplay($ret)

    [/autoit]

    funktioniert bei mir einwandfrei, bis auf die Tatsache, dass ich kein GTA-SA installiert habe^^

    Btw, der Rückgabewert des DLL-Calls ist ein array, daher $ret[0]
    Fürs debuggen ist das Arraydisplay SEHR hilfreich, zeigt es doch die Ein- und Rückgabeparameter.

  • Random Frage!

    • Andy
    • 18. Februar 2013 um 18:23

    so etwas geht sehr gut per Switch

    [autoit]

    $x = Random(0, 100,1)
    switch $x
    case 0 to 80
    $msg="0-80"
    case 81 to 90
    $msg="81-90"
    case 91 to 100
    $msg="91-100"
    EndSwitch
    msgbox(0,$x,$msg)

    [/autoit]
  • Diese AHK Funktion in AutoIt

    • Andy
    • 18. Februar 2013 um 18:13

    Hi,
    die Abfrage auf "Error","Error und so" ist so ziemlich das dämlichste, was es gibt...dass ein Fehler auftritt merkst du spätestens wenn etwas nicht wie vorgesehen funktioniert!
    Wenn schon ein Fehler auftritt, dann ist es clever, den Fehlercode abzufragen/auszugeben, der gibt dir jedenfalls schon reichlich Hinweise, was mit der Funktion bzw. deren Parametern nicht stimmt.
    Schon mal in die Hilfe zu den einzelnen Funkltionen geschaut?
    In so gut wiejeder Funktion gibt es Rückgabewerte bzw auch @error-codes:

    Zitat von Hilfe zu DllCall()

    Rückgabewert
    Erfolg: @error = 0.
    Fehler: setzt @error
    @error: 1 Die Dll-Datei kann nicht verwendet werden,
    2 unbekannter Rückgabewert "return type",
    3 Funktion "function" wurde in der DLL-Datei nicht gefunden.
    4 Falsche Anzahl von Parametern.
    5 Falscher Parameter.
    siehe Bemerkungen.

    Alles anzeigen


    Würdest du den @error abfragen (Cursor auf die Variable => Siehe Scite/Extras Debug To Msgbox / Debug to Console oder Ctrl+Shift+D (Alt+D)) dann hast du schon den ersten Hinweis wo der Fehler liegt.

    Welcher Fehler tritt bei dir auf?
    Ist die Dll ggf. eine .Net-Dll?
    Poste die Beschreibungen zu dieser Dll oder die entsprechenden *.h-Dateien.
    Im Zweifelsfall hänge die Dll einfach an deinen Post an, dann kann man mit den entsprechenden Viewern/Debuggern mal in die Dll reinschauen und wenigstens die Anzahl der Parameter und deren Format/Typ bestimmen.

    In dem von dir geposteten Quellcode wird im ersten Call die Speicher-Adresse der Funktion bestimmt und im 2. Call dann angesprungen. Das scheint in letzter Zeit in Mode gekommen zu sein, um abhängig vom Betriebssystem und 32/64Bit Architektur trotzdem nur eine Datei verwenden zu können/wollen/müssen.
    Also poste bei derartigen Anfragen dein BS und ob 32- oder 64Bit-System.

    Nur mit genauen Angaben von dir KANN hier geholfen werden, je genauer und je besser deine Anfrage, desto eher wird dir geholfen werden....ich kenne jedenfalls schon mindestens 20 Spezialisten für dein Problem hier im Forum, die aufgrund deines 1. Posts KEINESFALLS antworten werden....s.o.!
    Die verplempern nicht ihre Freizeit, nur um dir die Würmer aus der Nase zu ziehen!

    Also hau rein, damit das beim nächstenm Mal besser klappt :thumbup:

  • RosettaCode Sammelthread

    • Andy
    • 17. Februar 2013 um 17:03
    Zitat

    Hat jemand eine Idee, warum James Skript keinen AutoIt-Error hervorruft?
    Schon ab Q(30) geht fast nichts mehr.

    habe mal den Rekursionslevel und die Gesamtanzahl der Funktionsaufrufe protokolliert.

    Spoiler anzeigen
    [autoit]

    Global $r = 0, $v = 0

    [/autoit] [autoit][/autoit] [autoit]

    ;~ For $n = 1 To 20
    ;~ msgbox(0,0,"Q(" & $n & ") = " & Q($n) & @CRLF,1)
    ;~ Next
    MsgBox(0, 0, "Q(1000) = " & Q(30) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Func Q($n)
    $v += 1 ;anzahl gesamt aufrufe
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $v = ' & $v & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $r += 1 ;rekursionstiefe
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $r = ' & $r & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    If ($n = 1) Or ($n = 2) Then
    $r -= 1
    Return 1
    EndIf
    $t = Q($n - Q($n - 1)) + Q($n - Q($n - 2))
    $r -= 1
    Return $t
    EndFunc

    [/autoit]


    Die Rekursionstiefe ist imho nicht das Problem, die bleibt im Rahmen, aber so wie ich das sehe, wird bei jedem Funktionsaufruf für die Locals jeweils neu Speicher angefordert, das sieht man schön im Taskmanager bzw Debugger, jede Sekunde werden 2 zusätzliche MB "verbraten"
    Bei höheren Startwerten bspw Q(200) bekomme ich somit einen AutoIterror wg Speicherüberlauf.

  • StringInStr Funktioniert nicht richtig

    • Andy
    • 17. Februar 2013 um 14:07
    Zitat

    Auch schon versucht, ging nicht, Send wird erst garnicht aufgerufen, also stimmt wohl irgendwas mit StringInStr nicht.

    Aha, und du bist der Auserwählte, der das festgestellt hat...
    Wie wäre es denn, in irgendeiner Weise eine Fehleranalyse zur Feststellung der Unfähigkeit des Scripters einzubauen, anstatt einen Thread zu eröffnen, der im Titel sowohl die Programmierer von AutoIt, als auch sämtliche Anwender der Funktion beleidigt!

    Stringinstr funktioniert nämlich einwandfrei...

    Spoiler anzeigen
    [autoit]


    $chatlog="chatlog.txt"
    filewrite($chatlog, "heyho das ist ein text mit dem Inhalt Hi Stan")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While True
    $File = FileOpen($ChatLog, 0)
    $LastLine = FileReadLine($File, -1) ; Ich habe noch ein -1 angehängt, da du ja laut des Variablen-Namens die letzte Zeile auslesen möchtest
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $LastLine = ' & $LastLine & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    If StringInStr($LastLine, "Hi Stan") <> 0 Then ; Du brauchst hier ein "ungleich 0", da die Funktion die Position der "Fundstelle" zurück gibt, also nicht 0.
    Send("tHallo!")
    ; MsgBox(0, "TestBox", "Test, ob diese If-Abfrage wirklich aufgerufen wird")
    EndIf
    FileClose($File)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Problem beim Auslesen von Arrays

    • Andy
    • 17. Februar 2013 um 12:04

    Hi,
    natürlich kann man sich alle Werte des Arrays in Msgboxen ausgeben lassen, aber einfacher und verständlicher, wie Arrays aufgebaut bzw gefüllt werden ist die Anzeige mit _ArrayDisplay()

    [autoit]

    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    Dim $arr[5][3]
    For $i = 0 To UBound($arr, 2) - 1 ;beachte Dimension-Parameter in ubound()!
    For $j = 0 To UBound($arr, 1) - 1 ;beachte Dimension-Parameter in ubound()!
    $b = Random()
    $arr[$j][$i] = $b ;array füllen
    _ArrayDisplay($arr,$j&" "&$i) ;anzeigen
    Next
    Next

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($arr, "Array gefüllt")

    [/autoit]
  • Über die String-Dekompression

    • Andy
    • 17. Februar 2013 um 11:45

    Geschwindigkeit beim komprimieren verdoppelt, bei nochmal reduzierter Kompressionsrate. Wie gehabt, reiner AutoIt-Code!

    Spoiler anzeigen
    [autoit]

    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $file = @AutoItExe
    $stest = StringTrimLeft(StringToBinary(FileRead($file)), 2) ;0x entfernen

    [/autoit] [autoit][/autoit] [autoit]

    $len = StringLen($stest)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $len = ' & $len & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $t = TimerInit()
    $a = compbin($stest)
    $m = TimerDiff($t)
    $stest = ""
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $alen = StringLen($a)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $alen = ' & $alen & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $rate = Int($len / $m)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $rate = ' & $rate & " KB/s" & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    ConsoleWrite(@CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $t = TimerInit()
    $b = decompbin($a)
    $m = TimerDiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $blen = StringLen($b)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $blen = ' & $blen & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $rate = Int($blen / $m)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $rate = ' & $rate & " KB/s" & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func compbin(ByRef $string)
    $len = StringLen($string)

    [/autoit] [autoit][/autoit] [autoit]

    For $p = 0 To 15
    $token = Hex($p, 1) ;0-F
    $l = ""
    For $m = 1 To 7 ;0 bis 0000000, 1 bis 1111111 usw
    $l &= $token
    Next
    For $i = 7 To 3 Step -1 ;anzahl vorkommen
    $l = StringLeft($l, $i) ;
    $string = StringReplace($string, $l, $token & Chr(85 + $i), 0, 1);mehrfache ersetzen
    Next
    $string = StringReplace($string, $token & $token, Chr(Dec($token) + 71), 0, 1);doppelte ersetzen
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Dim $array[16 * 16 + 1][2] ;anzahl der permutationen 00 bis FF
    For $d = 0 To 255
    $double = Hex($d, 2) ;00 bis FF
    StringReplace($string, $double, $double, 0, 1)
    $array[$d][0] = @extended ;anzahl vorkommen im string
    $array[$d][1] = $double ;ins array schreiben
    Next
    _ArraySort($array, 1) ;nach häufigkeit sortieren
    ; _ArrayDisplay($array)

    [/autoit] [autoit][/autoit] [autoit]

    $ersetzen_string = ""
    For $i = 0 To 160 ;ascii-zeichen von 105 -255
    $s1 = $array[$i][1] ;00 bis FF
    If $array[$i][0] = 0 Then ExitLoop ;kein string zu ersetzen
    $s2 = Chr($i + 95) ;doppelbyte wird ersetzt durch dieses byte
    $ersetzen_string &= $s1 & $s2 ;doppelbyte & byte
    $string = StringReplace($string, $s1, $s2, 0, 1) ;2-byte durch 1-byte ersetzen
    Next
    $string = $ersetzen_string & $string ; LUT vorne an string anhängen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Perc = Round(StringLen($string) / $len * 100)
    ConsoleWrite("!> Compression: " & $Perc & "%" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Return $string
    EndFunc ;==>compbin

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func decompbin($string)

    [/autoit] [autoit][/autoit] [autoit]

    While 1 ;1-byte durch 2-byte ersetzen
    $ersetzen = StringLeft($string, 3) ;erste 3 bytes im string
    If Asc(StringRight($ersetzen, 1)) < 95 Then ExitLoop;wenn 3.Zeichen kein ersetzen-byte, dann ende
    $string = StringTrimLeft($string, 3);erste 3 bytes abschneiden
    $string = StringReplace($string, StringRight($ersetzen, 1), StringLeft($ersetzen, 2), 0, 1) ;ein byte durch 2 byte ersetzen
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 71 To 86 ;ersetzt G durch 00, H durch 11 usw
    $a = Hex($i - 71, 1)
    $string = StringReplace($string, Chr($i), $a & $a, 0, 1)
    Next
    For $i = 87 To 93 ;x-fache token
    $a = Chr($i) ;
    $pos = 1
    Do
    $pos = StringInStr($string, $a, 1, 1, $pos + 1)
    If $pos <> 0 Then
    $char = StringMid($string, $pos - 1, 1)
    $ersetzen = ""
    For $q = 1 To $i - 85
    $ersetzen &= $char
    Next
    $string = StringReplace($string, $char & $a, $ersetzen, 0, 1)
    EndIf
    Until $pos = 0
    Next
    Return $string

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>decompbin

    [/autoit]

    Habe mal mit extrem grossen Exe-Files getestet (bis zum Speicherüberlauf), das ist besser zu profilen^^
    Knackpunkt ist folgende Schleife, die beim komprimieren die meiste Zeit braucht.
    Es werden im String alle 256 Permutationen von 0-F (also WORDs 00 bis FF) und die Anzahl der Vorkommen gesucht.

    [autoit]

    #include <Array.au3>
    $string = StringTrimLeft(StringToBinary(FileRead(@AutoItExe)), 2) ;0x entfernen
    Dim $array[16 * 16 + 1][2] ;anzahl der permutationen 00 bis FF
    For $d = 0 To 255
    $double = Hex($d, 2) ;00,01,02,03... bis FF
    StringReplace($string, $double, $double, 0, 1);anzahl vorkommen im string suchen
    $array[$d][0] = @extended ;anzahl vorkommen im string
    $array[$d][1] = $double ;ins array schreiben
    Next
    _ArraySort($array, 1) ;nach häufigkeit sortieren
    _ArrayDisplay($array)

    [/autoit]


    Anschliessend werden die am häufigsten im String vorkommenden WORDs durch ein BYTE ersetzt...

    Jetzt zur Frage:
    Der gleiche String wird 255 mal nach unterschiedlichen WORDs durchsucht, der Knackpunkt bei der Suche sind die permanenten Ladezyklen, da immer ein anderer Speicherblock geladen werden muss.
    Mal angenommen, ein RegEx würde (was ich nicht weiß) EINEN Block aus dem String (Speicher) laden und diesen dann nach den 255 Words durchsuchen, dann könnte die Performance sich signifikant verbessern!
    Leider reicht mein Regex-Skill nicht für diese Aufgabe^^, Regexen zur Füllung eines Arrays mit der Anzahl der jeweiligen Vorkommen von 00 bis FF sind willkommen!

    //EDIT
    Hab nun selbst mal geRegExed, immerhin habe ich schon die Gesamtanzahl der Treffer ermittelt:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $file = @AutoItExe
    $stest = StringTrimLeft(StringToBinary(FileRead($file)), 2) ;0x entfernen
    ;$text=stringleft($stest,10000)

    [/autoit] [autoit][/autoit] [autoit]

    ;$stest="AFabcde00000DExyzFBabcAFAF"
    $pattern = "([0-9A-F]{2})"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $t = TimerInit()
    $a = StringRegExp($stest, $pattern, 3)
    $m = TimerDiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    $s = UBound($a)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $s = ' & $s & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    ;_arraydisplay($a)

    [/autoit]

    Jetzt müsste ich nur noch herausfinden, wie man die Anzahl der Einzeltreffer, also für 00,01,02...bis...FE,FF ermittelt, hat jemand nen Tip für mich?

  • Über die String-Dekompression

    • Andy
    • 16. Februar 2013 um 18:52

    Hi,

    mit einigen Zeilen mehr Code lässt sich das Ergebnis weiterhin verbessern, ohne großartig Performance zu verbraten!

    Die AutoIt.exe (1.5MB) wird auf 56% zusammengestampft, mit ca. 180Kb/s, also in ca. 8 Sekunden. Im komprimierten String werden nur Ascii-codes über 32 verwendet, d.h. keine Steuerzeichen.

    Das Entpacken geschieht ca. 2.5x schneller, also mit ca 430Kb/s, dauert auf meinem Rechner ca. 3 Sekunden.

    Nicht im anhängenden Script enthalten, habe ich noch weitere (einfachste) Verfahren angewendet, also simples Ersetzen von mehrfach vorkommenden 2-Byte-Strings durch 1 Byte.
    Allerdings steigt die Packzeit extrem an, welch ein Wunder^^
    Um die AutoIt.exe auf <50% zusammenzustampfen (damit bin ich gleichauf mit LZNT in der höchsten Stufe) braucht es schon über 10 min.
    Mit einem erfahrungsgemäß angenommenen Faktor 1000, den ein Assemblerscript schneller wäre, könnte man locker in den Bereich von LZNT kommen. Dann müsste man aber auch die Ascii-codes kleiner 32 benutzen, um das letzte bisschen Kompression rauszuholen^^


    Spoiler anzeigen
    [autoit]

    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $stest = StringTrimLeft(StringToBinary(FileRead(@AutoItExe)), 2) ;0x entfernen
    ;$stest = StringTrimLeft(StringToBinary(FileRead(@ScriptFullPath)), 2) ;0x entfernen

    [/autoit] [autoit][/autoit] [autoit]

    $len = StringLen($stest)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $len = ' & $len & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $t = TimerInit()
    $a = compbin($stest)
    $m = TimerDiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $alen = StringLen($a)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $alen = ' & $alen & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $rate = Int($len / $m)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $rate = ' & $rate & " KB/s" & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    ConsoleWrite(@CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $t = TimerInit()
    $b = decompbin($a)
    ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $b = ' & $b & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $m = TimerDiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $blen = StringLen($b)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $blen = ' & $blen & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $rate = Int($blen / $m)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $rate = ' & $rate & " KB/s" & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func compbin($string)
    ;$len = StringLen($string)

    [/autoit] [autoit][/autoit] [autoit]

    For $p = 0 To 15
    $token = Hex($p, 1) ;0-F
    $l = ""
    For $m = 1 To 26
    $l &= $token
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 26 To 3 Step -1 ;anzahl vorkommen
    $l = StringLeft($l, $i) ;
    $string = StringReplace($string, $l, $token & Chr(95 + $i), 0, 1)
    Next
    $string = StringReplace($string, $token & $token, Chr(Dec($token) + 71), 0, 1)

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit]

    Dim $array[16 * 16 + 1][2]
    For $d = 0 To 15
    For $b = 0 To 15
    $doublestring = Hex($d, 1) & Hex($b, 1) ;&hex($w,1)
    $dec = Dec($doublestring)
    StringReplace($string, $doublestring, $doublestring, 0, 1)
    $e = @extended
    $array[$dec][0] = $e
    $array[$dec][1] = $doublestring
    Next
    Next
    _ArraySort($array, 1) ;nach häufigkeit sortieren
    ;~ _ArrayDisplay($array)

    [/autoit] [autoit][/autoit] [autoit]

    $ersetzen_string = ""
    For $i = 0 To 120 ;ascii-zeichen hinter 130
    $s1 = $array[$i][1]
    If $array[$i][0] = 0 Then ExitLoop ;kein string zu ersetzen
    $s2 = Chr($i + 130)
    $ersetzen_string &= $s1 & $s2
    $string = StringReplace($string, $s1, $s2, 0, 1) ;2-byte durch 1-byte ersetzen
    Next
    $string = $ersetzen_string & $string

    [/autoit] [autoit][/autoit] [autoit]

    $Perc = Round(StringLen($string) / $len * 100)
    ConsoleWrite("!> Compression: " & $Perc & "%" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Return $string
    EndFunc ;==>compbin

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func decompbin($string)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $ersetzen = StringLeft($string, 3)
    If Asc(StringRight($ersetzen, 1)) < 130 Then ExitLoop
    $string = StringTrimLeft($string, 3)
    $string = StringReplace($string, StringRight($ersetzen, 1), StringLeft($ersetzen, 2), 0, 1) ;ein byte durch 2 byte ersetzen
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 71 To 86
    $a = Hex($i - 71, 1)
    $string = StringReplace($string, Chr($i), $a & $a, 0, 1)
    Next
    For $i = 97 To 122 ;x-fache token
    $a = Chr($i)
    $pos = 1
    Do
    $pos = StringInStr($string, $a, 1, 1, $pos + 1)
    If $pos <> 0 Then
    $char = StringMid($string, $pos - 1, 1)
    $ersetzen = ""
    For $q = 1 To $i - 95
    $ersetzen &= $char
    Next
    $string = StringReplace($string, $char & $a, $ersetzen, 0, 1)
    EndIf
    Until $pos = 0
    Next
    Return $string

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>decompbin

    [/autoit]
  • Open Office Calc öffnen und in Zeile / Spalte schreiben.

    • Andy
    • 16. Februar 2013 um 16:57
    Zitat

    Habe es jetzt mit
    _OOStoreBook("neue datei", "MS Excel 97")
    _OOCloseBook()
    _OOOpenBook("neue datei")
    gelöst.

    :thumbup:
    mach daraus einfach eine Funktion..._OOSaveASBook($dateiname,$format), und häng diese Funktion hinten an den Thread an...dann haben alle etwas davon ;)

  • Quizfrage (dt. Städte)

    • Andy
    • 16. Februar 2013 um 10:54

    @BF, so weit war ich auch schon.... :D
    In allen Städten leben Menschen, und die Autos, die dort fahren, haben alle ein Nummernschild. Aus den Buchstaben aller dieser Nummernschilder kann man feine Wörter bilden....AUTOIT z.B. :rock:
    Die Quersumme(n) der Ascii-codes der Buchstaben der Städte führen zu 42.... 8o

    //EDIT
    was mich jetzt beschäftigt ist die Frage, wie ich eine Suche in einer beliebigen Suchmaschine initiiere, die mir die "Gemeinsamkeiten" der Suchwörter (also genau passend zur Problemstellung) abbildet.
    Die Suchmaschinen listen doch nur das häufigste Vorkommen aller Suchbegriffe auf EINER Webseite auf....

  • Open Office Calc öffnen und in Zeile / Spalte schreiben.

    • Andy
    • 16. Februar 2013 um 10:48

    Hallo Holger,

    genau wegen dieser und auch anderer Einschränkungen habe ich mir meine eigene Funktionssammlung geschrieben.

    Der Kollege, dessen UDF du benutzt, geht stillschweigend davon aus, dass grundsätzlich nur TEXT in eine Zelle eingefügt wird.
    Keine Zahlen, keine Formeln usw...


    Wenn du nur Werte, also ein VALUE einfügen möchtest, ändere die Funktion _OOoCalc_WriteCell () folgendermassen ab:

    Spoiler anzeigen
    [autoit]

    Func _OOoCalc_WriteCell($oCurCom, $Worksheet, $data, $sRow, $sColumn)
    $CellAddress = CHR($sColumn + 64) & $sRow

    [/autoit] [autoit][/autoit] [autoit]

    If NOT IsObj($oCurCom) Then Return SetError(1, 0, 0)
    $Sheets = $oCurCom.GetSheets()
    $SheetComponent = $Sheets.GetByName($Worksheet)
    $CellComponent = $SheetComponent.GetCellRangeByName($CellAddress)
    $CellComponent.value() = $data ;***********************hier geändert************
    $CellValue = $CellComponent.getstring()
    MsgBox(0,$CellAddress,$CellValue)
    Return
    EndFunc

    [/autoit]

    Damit sollten nur Werte eingefügt werden, für Formeln, Text usw. musst du die "UDF" entsprechend erweitern bzw. umschreiben.

    Oder probier einfach mal meine "Funktionssammlung", dort kann man nämlich beim Schreiben/Lesen einer Zelle das Format angeben...

  • Quizfrage (dt. Städte)

    • Andy
    • 16. Februar 2013 um 09:13

    Hi,
    zunächst stelle ich fest, die Städte sind alle im Norden bzw. Osten Deutschlands, erst hatte ich auf Hansestädte getippt, aber Eisleben ist dann doch bissl zu weit von der Küste entfernt^^

  • Umgebungsvariablen ermitteln

    • Andy
    • 14. Februar 2013 um 21:59
    Spoiler anzeigen
    [autoit]

    ; Generated by AutoIt Scriptomatic

    [/autoit] [autoit][/autoit] [autoit]

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"

    [/autoit] [autoit][/autoit] [autoit]

    $Output=""
    $Output = $Output & "Computer: " & $strComputer & @CRLF
    $Output = $Output & "==========================================" & @CRLF
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Environment", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit] [autoit][/autoit] [autoit]

    If IsObj($colItems) then
    For $objItem In $colItems
    $Output = $Output & "Caption: " & $objItem.Caption & @CRLF
    $Output = $Output & "Description: " & $objItem.Description & @CRLF
    $Output = $Output & "InstallDate: " & WMIDateStringToDate($objItem.InstallDate) & @CRLF
    $Output = $Output & "Name: " & $objItem.Name & @CRLF
    $Output = $Output & "Status: " & $objItem.Status & @CRLF
    $Output = $Output & "SystemVariable: " & $objItem.SystemVariable & @CRLF
    $Output = $Output & "UserName: " & $objItem.UserName & @CRLF
    $Output = $Output & "VariableValue: " & $objItem.VariableValue & @CRLF
    if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
    $Output=""
    Next
    Else
    Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_Environment" )
    Endif

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func WMIDateStringToDate($dtmDate)

    [/autoit] [autoit][/autoit] [autoit]

    Return (StringMid($dtmDate, 5, 2) & "/" & _
    StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
    & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate,13, 2))
    EndFunc

    [/autoit]


    Script wurde erstellt vom Tool AutoIt Scriptomatic von GEOSoft, dass von mir durch einen einfachen Filter erweitert wurde....

  • Umgebungsvariablen ermitteln

    • Andy
    • 14. Februar 2013 um 21:47

    Hi,

    Zitat

    ganz ehrlich, elegant ist es nicht gerade:

    Nein, elegant ist das nicht.....
    Elegant ist,

    Code
    Umgebungsvariable site:autoit.de

    in google einzugeben und die ersten 1-2 links durchzuklickern....
    oder direkt in der AutoIt-Hilfe im "Suchen" Reiter einfach *umgebungsvariable* einzugeben und dort dann das entsprechende Ergebnis abzufragen ;)

  • Problem bei Array bzw. Routen

    • Andy
    • 14. Februar 2013 um 18:53

    Schau mal nach Scripten bzw Programmen in Basic zum Thema "Kritischer Pfad" (Kritischer Weg), da findest du sicher etwas...

  • Problem bei Array bzw. Routen

    • Andy
    • 14. Februar 2013 um 18:04

    Hi,

    Zitat

    was ich nicht verstehe: Warum ist die kürzeste Strecke immer eine andere?


    Na, weil die Koordinaten der "Städte" bei jedem neuen Durchlauf zufällig erzeugt werden^^

    Zitat

    und wie kann ich in dein Programm einbinden das er nicht irgendwelche werte für die Punkte und längen benutzt sondern von mit vorgegebene?

    Einbinden ist schlecht, da hast du schneller ein Script geschrieben, dass zu deinem Problem passt...

    Zitat

    also z. B. für diese Karte? (siehe Anhang)

    Wieso taucht dein "Problem" erst im 11. Post auf 8|

    Naja, ich würde die einzelnen Strecken benennen und die Länge zuordnen => "B-I" = "I-B" = 34

    Jede "Stadt" hat Nachbarn, du kannst also eine Liste erstellen, um alle möglichen Wege vom Startpunkt zum Endpunkt zu erstellen.
    Gesucht, der Weg von A nach Y:
    Anfangen mit A

    A-M
    A-N
    A-D

    Nun die Nachbarn der Nachbarn

    A-M-C
    A-M-X
    A-M-I

    A-N-D
    A-N-X
    A-N-Z

    A-D-N
    A-D-B
    A-D-L

    usw usf....dann hast du irgendwann den Zielpunkt auf allen möglichen Wegen erreicht und musst nur noch den kürzesten Weg bestimmen

    Mögl. Lösungsweg:
    Eintragen der Start- und Zielstädte in ein Array (mit den Abständen) und dann einen Algorithmus schreiben, der den kürzesten Weg findet!

    In der Netzplantechnik nennt man das einen "Kritischen Pfad"

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™