Glücklichen Herzwunsch und alles Gute!
Beiträge von Andy
-
-
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 -
[autoit]
#AutoIt3Wrapper_usex64=n
[/autoit][autoit][/autoit][autoit]
$dll = DllOpen("API.dll")
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $dll = ' & $dll & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console$ret = DllCall($dll, "uint:cdecl", "API_GetScreenSizeX");, "int", 0x123456, "str", "Text")
[/autoit]
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
_arraydisplay($ret)zuerst muss die dll geöffnet werden, ansonsten passiert garnichts....
Hast du #AutoIt3Wrapper_usex64=n definitiv in deinem Script? -
Freunde der Nacht....wie soll denn StringReplace() funktionieren, wenn die falschen Variablen verwendet werden?
[autoit]Global $String = "Test1 – TEst2"
[/autoit]
Local $text2 = StringReplace($String, '–', "-",1,0) ; Hier 4. Parameter 0 (siehe Hilfe)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $text2 = ' & $text2 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console -
Hi,
ZitatAlso 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")
[/autoit][autoit][/autoit][autoit]
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $dll = ' & $dll & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console$ret = DllCall($dll, "uint:cdecl", "API_GetScreenSizeX");, "int", 0x123456, "str", "Text")
[/autoit]
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)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. -
so etwas geht sehr gut per Switch
[autoit]$x = Random(0, 100,1)
[/autoit]
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) -
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()Alles anzeigenRü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.
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

-
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
[/autoit] [autoit][/autoit] [autoit]
;~ msgbox(0,0,"Q(" & $n & ") = " & Q($n) & @CRLF,1)
;~ Next
MsgBox(0, 0, "Q(1000) = " & Q(30) & @CRLF)Func Q($n)
[/autoit] [autoit][/autoit] [autoit]
$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 ConsoleIf ($n = 1) Or ($n = 2) Then
[/autoit]
$r -= 1
Return 1
EndIf
$t = Q($n - Q($n - 1)) + Q($n - Q($n - 2))
$r -= 1
Return $t
EndFunc
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. -
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]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$chatlog="chatlog.txt"
filewrite($chatlog, "heyho das ist ein text mit dem Inhalt Hi Stan")While True
[/autoit] [autoit][/autoit] [autoit]
$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)
WEndExit
[/autoit] [autoit][/autoit] [autoit][/autoit] -
Hi,
[autoit]
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()#include <Array.au3>
[/autoit][autoit][/autoit][autoit]Dim $arr[5][3]
[/autoit][autoit][/autoit][autoit]
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_ArrayDisplay($arr, "Array gefüllt")
[/autoit] -
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
[/autoit] [autoit][/autoit] [autoit]
$stest = StringTrimLeft(StringToBinary(FileRead($file)), 2) ;0x entfernen$len = StringLen($stest)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $len = ' & $len & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console$t = TimerInit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$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)$t = TimerInit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$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 ConsoleExit
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func compbin(ByRef $string)
[/autoit] [autoit][/autoit] [autoit]
$len = StringLen($string)For $p = 0 To 15
[/autoit] [autoit][/autoit] [autoit]
$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
NextDim $array[16 * 16 + 1][2] ;anzahl der permutationen 00 bis FF
[/autoit] [autoit][/autoit] [autoit]
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)$ersetzen_string = ""
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
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$Perc = Round(StringLen($string) / $len * 100)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite("!> Compression: " & $Perc & "%" & @CRLF)Return $string
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>compbinFunc decompbin($string)
[/autoit] [autoit][/autoit] [autoit]While 1 ;1-byte durch 2-byte ersetzen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$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
WEndFor $i = 71 To 86 ;ersetzt G durch 00, H durch 11 usw
[/autoit] [autoit][/autoit] [autoit]
$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 $stringEndFunc ;==>decompbin
[/autoit]Habe mal mit extrem grossen Exe-Files getestet (bis zum Speicherüberlauf), das ist besser zu profilen^^
[autoit]
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.#include <Array.au3>
[/autoit]
$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)
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
[/autoit] [autoit][/autoit] [autoit]
$stest = StringTrimLeft(StringToBinary(FileRead($file)), 2) ;0x entfernen
;$text=stringleft($stest,10000);$stest="AFabcde00000DExyzFBabcAFAF"
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$pattern = "([0-9A-F]{2})"$t = TimerInit()
[/autoit] [autoit][/autoit] [autoit]
$a = StringRegExp($stest, $pattern, 3)
$m = TimerDiff($t)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console$s = UBound($a)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $s = ' & $s & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console;_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?
-
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
[/autoit] [autoit][/autoit] [autoit]
;$stest = StringTrimLeft(StringToBinary(FileRead(@ScriptFullPath)), 2) ;0x entfernen$len = StringLen($stest)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $len = ' & $len & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console$t = TimerInit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$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)$t = TimerInit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$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 ConsoleExit
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func compbin($string)
[/autoit] [autoit][/autoit] [autoit]
;$len = StringLen($string)For $p = 0 To 15
[/autoit] [autoit][/autoit] [autoit]
$token = Hex($p, 1) ;0-F
$l = ""
For $m = 1 To 26
$l &= $token
NextFor $i = 26 To 3 Step -1 ;anzahl vorkommen
[/autoit] [autoit][/autoit] [autoit]
$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)Next
[/autoit] [autoit][/autoit] [autoit]Dim $array[16 * 16 + 1][2]
[/autoit] [autoit][/autoit] [autoit]
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)$ersetzen_string = ""
[/autoit] [autoit][/autoit] [autoit]
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$Perc = Round(StringLen($string) / $len * 100)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite("!> Compression: " & $Perc & "%" & @CRLF)Return $string
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>compbinFunc decompbin($string)
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$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
WEndFor $i = 71 To 86
[/autoit] [autoit][/autoit] [autoit]
$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 $stringEndFunc ;==>decompbin
[/autoit] -
Zitat
Habe es jetzt mit
_OOStoreBook("neue datei", "MS Excel 97")
_OOCloseBook()
_OOOpenBook("neue datei")
gelöst.
mach daraus einfach eine Funktion..._OOSaveASBook($dateiname,$format), und häng diese Funktion hinten an den Thread an...dann haben alle etwas davon
-
@BF, so weit war ich auch schon....
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.
Die Quersumme(n) der Ascii-codes der Buchstaben der Städte führen zu 42....
//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.... -
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)
[/autoit] [autoit][/autoit] [autoit]
$CellAddress = CHR($sColumn + 64) & $sRowIf NOT IsObj($oCurCom) Then Return SetError(1, 0, 0)
[/autoit]
$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
EndFuncDamit 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...
-
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^^ -
Spoiler anzeigen
[autoit]; Generated by AutoIt Scriptomatic
[/autoit] [autoit][/autoit] [autoit]$wbemFlagReturnImmediately = 0x10
[/autoit] [autoit][/autoit] [autoit]
$wbemFlagForwardOnly = 0x20
$colItems = ""
$strComputer = "localhost"$Output=""
[/autoit] [autoit][/autoit] [autoit]
$Output = $Output & "Computer: " & $strComputer & @CRLF
$Output = $Output & "==========================================" & @CRLF
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Environment", "WQL", _
$wbemFlagReturnImmediately + $wbemFlagForwardOnly)If IsObj($colItems) then
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
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" )
EndifFunc WMIDateStringToDate($dtmDate)
[/autoit] [autoit][/autoit] [autoit]Return (StringMid($dtmDate, 5, 2) & "/" & _
[/autoit]
StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
& " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate,13, 2))
EndFunc
Script wurde erstellt vom Tool AutoIt Scriptomatic von GEOSoft, dass von mir durch einen einfachen Filter erweitert wurde.... -
Hi,
Zitatganz ehrlich, elegant ist es nicht gerade:
Nein, elegant ist das nicht.....
Elegant ist,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
-
Schau mal nach Scripten bzw Programmen in Basic zum Thema "Kritischer Pfad" (Kritischer Weg), da findest du sicher etwas...
-
Hi,
Zitatwas 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^^Zitatund 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...
Zitatalso z. B. für diese Karte? (siehe Anhang)
Wieso taucht dein "Problem" erst im 11. Post auf

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 AA-M
A-N
A-DNun die Nachbarn der Nachbarn
A-M-C
A-M-X
A-M-IA-N-D
A-N-X
A-N-ZA-D-N
A-D-B
A-D-Lusw 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"