Auf diesem Forum tanzt der Bär
Beiträge von eukalyptus
-
-
@BufIx: Oh, das wußte ich nicht...Danke für die Info!
Der PreFix sollte natürlich auch noch auf seine Regularität überprüft werden, damit man keine unerlaubten Sonderzeichen verwenden kann...
lgE
-
Hi
erstmal: Sehr genial, meine Hochachtung!hab einen (möglichen) Bug entdeckt:
Zeile 77: $sNewFolder = StringReplace(StringReplace($aSource[$i], $sFile, ''), $sSourcePath, '')
Ein Ordner kann durchaus zb "Test.zip" heißen. Wenn nun eine Datei in diesem Ornder auch "Test.zip" heißt, dann wird auch der Ordner replaced!
Deshalb hab ich die Zeile 77 auf folgende geändert:
$sNewFolder = StringTrimLeft(StringLeft($aSource[$i],StringInStr($aSource[$i],"\",0,-1)),StringLen($sSourcePath))weiters hab ich mir erlaubt einen weiteren Parameter hinzuzufügen:
_MultiFileCopy($aSource, $sDestPath, $bOverWrite = True, $sPreFix = "Copy")Wenn $bOverWrite=False, dann wird die ZielDatei, falls sie existiert, nicht überschrieben, sondern mit dem Prefix umbenannt ("Text.txt" wird zu "Copy1_Text.txt")
Falls auch die "Copy1_Text.txt" schon existiert, dann "Copy2_Text.txt"
und die Zieldateien werden als Array zurückgegebenIch brauchte das so für ein Projekt von mir...
Script 2 mal laufen lassen, dann sollten die Dateien der 2 Demo (Zeile 28 ) umbenannt werden!
Spoiler anzeigen
[autoit];===werden benötigt=============================================================
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include<String.au3>
#include<WindowsConstants.au3>
#include<Misc.au3>
;===============================================================================;===Beispiel 1 (komplettes Verzeichnis kopieren)================================
[/autoit] [autoit][/autoit] [autoit]
; Alle Dateien und Unterverzeichnisse (rekursiv) werden kopiert
; Verzeichnisstruktur der Quelle wird übernommen
Global $sSourcePath = 'C:\Programme\AutoIt3\AutoitX'
Global $sDestinationPath = @ScriptDir & '\Tmp1'; Zielpfad (wird ggf. erstellt)$Ret=_MultiFileCopy($sSourcePath, $sDestinationPath)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
For $i= 1 to $Ret[0]
MsgBox(0, "Dateien überschreiben", $i & " / " & $Ret[0] & @CRLF & $Ret[$i])
Next
;===============================================================================;===Beispiel 2 (mehrere Dateien kopieren)=======================================
[/autoit] [autoit][/autoit] [autoit]
; Alle Dateien aus dem Array werden ins Zielverzeichnis kopiert
; Array[0] muss die Anzahl der zu kopierenden Dateien enthalten
Global $aSource[4] = [3, @SystemDir & '\shell32.dll', @SystemDir & '\mspaint.exe', @SystemDir & '\eula.txt']
Global $sDestinationPath = @ScriptDir & '\Tmp2'; Zielpfad (wird ggf. erstellt)$Ret=_MultiFileCopy($aSource, $sDestinationPath, False)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
For $i= 1 to $Ret[0]
MsgBox(0,"Vorhandene Dateien umbenennen", $i & " / " & $Ret[0] & @CRLF & $Ret[$i])
Next
;===============================================================================;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
;
; Function Name: _MultiFileCopy
; Description:: Kopiert mehrere Dateien mit Progressbar
; Parameter(s): Array mit Dateien zum kopieren, Zielpfad
; Requirement(s):
; #include<String.au3>
; #include<WindowsConstants.au3>
; #include<Misc.au3>
; Author(s): Tom99, progandy and Oscar (http://www.autoit.de)
;
;===============================================================================
;
Func _MultiFileCopy($aSource, $sDestPath, $bOverWrite = True, $sPreFix = "Copy")
Local $opt = Opt('GUICloseOnESC', 0), $ret, $sShowSource, $sShowDest, $sSourcePath = '', $sNewFolder = '', $i, $j, $k
Local $aMFC[12] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, False, DllOpen('user32.dll')]
If Not IsArray($aSource) Then
$sSourcePath = $aSource
If StringRight($sSourcePath, 1) <> '\' Then $sSourcePath &= '\'
ToolTip('Bitte warten! Verzeichnis wird eingelesen!')
$aSource = _GetFilesFolder_Rekursiv($aSource, '*', 0)
ToolTip('')
Else
If Not IsNumber($aSource[0]) Then Return SetError(1, 0, 0)
EndIf
Local $aReturn = $aSource
If StringRight($sDestPath, 1) <> '\' Then $sDestPath &= '\'
If Not FileExists($sDestPath) Then
If Not DirCreate($sDestPath) Then Return SetError(2, 0, 0)
EndIf
$sShowDest = StringRegExpReplace($sDestPath, '(.{15})(.*)(.{35})', '$1' & '[...]' & '$3')
Local $aFileSize[UBound($aSource)]
For $i = 1 To $aSource[0]
$aFileSize[$i] = FileGetSize($aSource[$i])
$aMFC[7] += $aFileSize[$i]
Next
Local $callback = DllCallbackRegister('__Progress', 'int', 'uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;str')
Local $ptr = DllCallbackGetPtr($callback)
__ProgressCreate($aMFC)
$aMFC[9] = TimerInit()
For $i = 1 To $aSource[0]
$sArray = ''
For $j = 0 To 11
$sArray &= $aMFC[$j] & ';'
Next
If $sSourcePath <> '' Then
$sNewFolder = StringTrimLeft(StringLeft($aSource[$i],StringInStr($aSource[$i],"\",0,-1)),StringLen($sSourcePath))
If Not FileExists($sDestPath & $sNewFolder) Then
If Not DirCreate($sDestPath & $sNewFolder) Then Return SetError(3, 0, 0)
EndIf
EndIf
$sFile = StringMid($aSource[$i], StringInStr($aSource[$i], '\', 0, -1) + 1)
$k = 0
While $bOverWrite=False And FileExists($sDestPath & $sNewFolder & $sFile)
$k+=1
$sFile=$sPreFix & $k & "_" & StringMid($aSource[$i], StringInStr($aSource[$i], '\', 0, -1) + 1)
WEnd
$sShowSource = StringRegExpReplace($aSource[$i], '(.{15})(.*)(.{35})', '$1' & '[...]' & '$3')
GUICtrlSetData($aMFC[1], 'Kopiere Datei ' & @CRLF & '"' & $sShowSource & '"' & @CRLF & 'nach: "' & $sShowDest & '"')
$ret = DllCall('kernel32.dll', 'int', 'CopyFileExA', 'str', $aSource[$i], 'str', $sDestPath & $sNewFolder & $sFile, 'ptr', $ptr, 'str', $sArray, 'int', 0, 'int', 0)
$aReturn[$i] = $sDestPath & $sNewFolder & $sFile
;~ ConsoleWrite('Return: ' & $ret[0] & @LF)
If $ret[0] = 0 Then $aMFC[10] = True
$aMFC[8] += $aFileSize[$i]
Next
GUIDelete($aMFC[0])
DllClose($aMFC[11])
Opt('GUICloseOnESC', $opt)
Return $aReturn
EndFunc ;==>_MultiFileCopyFunc __ProgressCreate(ByRef $aMFC)
[/autoit] [autoit][/autoit] [autoit]
$aMFC[0] = GUICreate('FileCopy', 480, 220, -1, -1, $WS_POPUPWINDOW)
$aMFC[1] = GUICtrlCreateLabel('', 10, 10, 460, 65)
GUICtrlSetFont(-1, 10, 400, 0, 'Courier New')
GUICtrlCreateLabel('Datei:', 10, 83, 60, 16)
GUICtrlSetFont(-1, 11, 600, 0, 'Courier New')
$aMFC[2] = GUICtrlCreateLabel('0 %', 80, 83, 390, 16)
GUICtrlSetFont(-1, 11, 600, 0, 'Courier New')
$aMFC[4] = GUICtrlCreateProgress(10, 100, 460, 20)
GUICtrlCreateLabel('Gesamt:', 10, 133, 60, 16)
GUICtrlSetFont(-1, 11, 600, 0, 'Courier New')
$aMFC[3] = GUICtrlCreateLabel('0 %', 80, 133, 390, 16)
GUICtrlSetFont(-1, 11, 600, 0, 'Courier New')
$aMFC[5] = GUICtrlCreateProgress(10, 150, 460, 20)
$aMFC[6] = GUICtrlCreateButton('Abbrechen', 200, 185, 75, 25)
GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
GUISetState()
Sleep(200)
EndFunc ;==>__ProgressCreateFunc __Progress($FileSize, $BytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
[/autoit] [autoit][/autoit] [autoit]
Local $aSplit = StringSplit(StringTrimRight($lpData, 1), ";")
If $aSplit[11] = 'True' Then Return 1
Local $pos = GUIGetCursorInfo($aSplit[1])
If _IsPressed('1B', Int($aSplit[12])) Then Return 1
If _IsPressed('01', Int($aSplit[12])) And ($pos[4] = Int($aSplit[7])) Then Return 1
Local $sPercent = Round($BytesTransferred / $FileSize * 100, 0), $iTime, $iTotalTime, $iTransferRate
Local $sPercentAll = Round(($aSplit[9] + $BytesTransferred) / $aSplit[8] * 100, 0)
If GUICtrlRead($aSplit[5]) <> $sPercent Then
$iTime = TimerDiff($aSplit[10])
$iTotalTime = Ceiling($iTime / 1000 / ($sPercentAll + 0.1) * 100)
$iTransferRate = _StringAddThousandsSep(Int($aSplit[8] / $iTotalTime / 1000), '.', ',')
GUICtrlSetData($aSplit[3], $sPercent & ' %')
GUICtrlSetData($aSplit[5], $sPercent)
If GUICtrlRead($aSplit[6]) <> $sPercentAll Then
GUICtrlSetData($aSplit[4], $sPercentAll & ' % Zeit: ' & Int($iTime / 1000) & '/' & $iTotalTime & ' s (' & $iTransferRate & ' KB/s)')
GUICtrlSetData($aSplit[6], $sPercentAll)
EndIf
EndIf
EndFunc ;==>__Progress;==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
; Description: Rekursive Auflistung von Dateien und/oder Ordnern
; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
; optional: $iRetType 0 gibt Array, 1 gibt String zurück
; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;==================================================================================================
Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
Global $oFSO = ObjCreate('Scripting.FileSystemObject')
Global $strFiles = ''
Switch $sDelim
Case '1'
$sDelim = @CR
Case '2'
$sDelim = @LF
Case '3'
$sDelim = ';'
Case '4'
$sDelim = '|'
Case Else
$sDelim = @CRLF
EndSwitch
If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
If $sExt = -1 Then $sExt = '*'
If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
_ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
If $iRetType = 0 Then
Local $aOut
$aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
If $aOut[1] = '' Then
ReDim $aOut[1]
$aOut[0] = 0
EndIf
Return $aOut
Else
Return StringTrimRight($strFiles, StringLen($sDelim))
EndIf
EndFuncFunc _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
[/autoit]
If Not IsDeclared("strFiles") Then Global $strFiles = ''
If ($Dir = -1) Or ($Dir = 0) Then
For $file In $Folder.Files
If $Ext <> '*' Then
If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
$strFiles &= $file.Path & $Delim
Else
$strFiles &= $file.Path & $Delim
EndIf
Next
EndIf
For $Subfolder In $Folder.SubFolders
If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
_ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
Next
EndFuncAußerdem hab ich die Variablen $i und $j in der Funktion deklariert, da es sonst zu Problemen kommen kann, wenn man die Funktion in einer $i-Schleife aufruft...
lgE
-
Ähm, was willst du genau?
Falls es unterschiedlich viele Parameter sein können, dann wär es einfacher, sie in einer Schleife auszuwerten.
lgE
-
es gibt viele Möglichkeiten, dein Problem zu lösen.
erstens: um ein Bild in einer GUI zu ändern ist es besser GuiCtrlSetImage zu verwenden, anstatt GuiCtrlDelete und dann GuiCtrlCreatePic
hier mal einige Möglichkeiten; Ich hab versucht es so zu erklären, wie du deinen Frage gestellt hast also sehr kurz und nicht im Detail verständlich
1)Erstelle in GUI1 einen Button mit einer Bildänderfunktion
Vom GUI2 aus klickst du mit ControlClick auf diesen Button...2)GUI1 ließt alle paar Sekunden eine Ini-Datei aus
GUI2 ändert die Ini-Datei3)Wie Methode 2, nur via MemoryWrite / MemoryRead
4)GUI1 verwende GuiRegisterMsg mit der enstsprechenden Bildänderfunktion
GUI2 Sende die Message an GUI15)GUI2 schreibt in StdOut
GUI1 ließt StdinlgE
-
Schau dir mal die Hilfe zu Opt("",) an
lgE
-
Oscar : Doch! Den Trick hast nur du benutzt.
[autoit]
Autoit kann 18 stellige Zahlen berechnen (64Bit), doch Stringzahlen gehen nur bis 14 stellen!?!$String_a="999999999999999999"
[/autoit]
$String_b="999999999999999999"
$Int_a=999999999999999999
$Int_b=999999999999999999
MsgBox(0,"Int",$Int_a + $Int_b) ; = 1999999999999999998
MsgBox(0,"String",$String_a + $String_b) ; = 2e+018
MsgBox(0,"Int(String)",Int($String_a) + Int($String_b)) ; = 1999999999999999998
Zumindest Bugfix, Funkey und ich haben "nur" mit 14 Stellen gerechnet...
Und pro Rechenschritt gleich 4 Stellen mehr zu verarbeiten bringt doch enorm viel Zeitersparnis.Edit (zu meiner Erklärung oben): theoretisch sollte meine Multiplikation 140000-stellige Zahlen schaffen, bevor ein Arraywert die 64Bit Grenze sprengt. Allerdings benötigt das Multiplizieren von zwei 20000-stelligen Zahlen schon 70 Sekunden, somit sollte man sich beim Berechnen von viel größeren Zahlen einen Rasierapparat bereitlegen
-
Na logisch hab ich überoptimiert - hab ich aber gesagt, daß mein Script fehlerhaft laufen würde, wenn die Zahlen zb. 99999999... hätten!
dann hier noch meine vorletzte Version vom 9 September (mit der geht der Bugfix-Test)
Average: 0.0385 sec.
Minimum: 0.0336 sec.
Maximum: 0.0448 sec.Spoiler anzeigen
[autoit]#include-once
[/autoit] [autoit][/autoit] [autoit]Global $L, $R, $E, $T, $i, $j, $C
[/autoit] [autoit][/autoit] [autoit]Func _BigInt_Add($a, $b)
[/autoit] [autoit][/autoit] [autoit]
$L = StringLen($a)
$T = StringLen($b)
$R=0
$E=""
If $L < $T Then $L=$T
For $i = $L To 1 Step -14
$T = StringRight($a, 14) + StringRight($b, 14) + $R
$a = StringTrimRight($a, 14)
$b = StringTrimRight($b, 14)
$R = Floor($T / 100000000000000)
$T = Mod($T, 100000000000000)
If $i > 14 And $T <= 10000000000000 Then $T = StringRight("00000000000000" & $T, 14)
$E = $T & $E
Next
Return $E
EndFunc ;==>_BigInt_AddFunc _BigInt_Mul($a, $b)
[/autoit] [autoit][/autoit] [autoit]
$a = _Split7($a)
$b = _Split7($b)
Local $E[$a[0] + $b[0]] = [$a[0] + $b[0] - 1]
For $i = 1 To $b[0]
For $j = 1 To $a[0]
$E[$j + $i - 1] += $a[$j] * $b[$i]
Next
Next
Return _Merge7($E)
EndFunc ;==>_BigInt_MulFunc _Merge7($a)
[/autoit] [autoit][/autoit] [autoit]
$E=""
$R=0
For $i = $a[0] To 1 Step -1
$a[$i] += $R
$R = Floor($a[$i] / 10000000)
$T = Mod($a[$i], 10000000)
If $i > 1 And $T <= 10000000 Then $T = StringRight("00000000000000" & $T, 7)
$E = $T & $E
Next
If $R > 0 Then $E = $R & $E
If $E = 0 Then $E = "0"
Return $E
EndFunc ;==>_Merge7Func _Split7($a)
[/autoit] [autoit][/autoit] [autoit]
$L = StringLen($a)
$C = Ceiling($L / 7)
Local $E[$C + 1]
For $i = $L To 1 Step -7
$E[$C] = StringRight($a, 7)
$a = StringTrimRight($a, 7)
$C -= 1
Next
$E[0] = Ceiling($L / 7)
Return $E
EndFunc ;==>_Split7Func _BigInt_Load($a)
[/autoit] [autoit][/autoit] [autoit]
Return $a
EndFunc ;==>_BigInt_LoadFunc _BigInt_Print($a)
[/autoit]
While StringLeft($a, 1) = "0" And StringLen($a) > 1
$a = StringTrimLeft($a, 1)
WEnd
Return $a
EndFunc ;==>_BigInt_PrintIch versuch mal meine Multiplikation zu erklären, anhand 456*123:
Spoiler anzeigen
Schulmethode:
456*123
---------
45600
.9120
..1368
-------
56088hier werden alle einzelnen Ziffern miteinander multipliziert, der Übertrag an die nächste weitergegeben und die Teilergebnisse addiert.
Wenn man sich die Teilergebnisse nun anschaut, stellt man fest, daß die Stelle von 6*1 in einem anderen Teilergebnis 5*2 und im nächsten 4*3 ist.
So komm ich auf meine Methode. Ich spare mir den Übertrag vorerst und addiere die einzelnen Multiplikationen gleichMeine Methode: (Bei meinem Script verwende ich 7-stellige Array´s; zum Veranschaulichen hier nur 1-stellige)
jede Ziffer kommt in ein eigenes Array: [4] [5] [6] * [1] [2] [3]
Das Ergebnis ist auch ein Array:
[1] = 4*1 = 4
[2] = 5*1 + 4*2 = 13
[3] = 6*1 + 5*2 + 4*3 = 28
[4] = 6*2 + 5*3 = 27
[5] = 6*3 = 18nun hab ich: [4] [13] [28] [27] [18]
dieses Array füge ich nun zum Ergebnis, indem ich hier nun von rechts nach links den Übertrag weitergebe:
Einserstelle [18] des Ergebnis ist 8, Übertrag zu Zehnerstelle [27] ist 1...usw.
[4] [13] [28] [27] [18]=
56088Die Geschwindigkeit erreiche ich dadurch, daß ich NICHT für jedes Teilergebnis den Übertrag berechne, sondern erst am Schluß und das nur 1Mal!
Außerdem sind die einzelnen Additionen so klein, daß ich die Autoit-Addition verwenden kann.an dieser Stelle möchte ich auch gleich ein Problem darstellen:
betrachten wir eine Zeile von oben: [3] = 6*1 + 5*2 + 4*3 = 28
Je länger die zu berechnenden Zahlen sind, desto länger wird auch diese Zeile!
theoretisch wird irgendwann die berechenbare Grenze erreicht, also wenn das Ergebnis dieser Zeile für Autoit zu groß wird.
Für diesen Fall benötigt man dann eine andere Lösung (Zwischendurch Übertrag berechnen und diese Teilergebnisse mit _BigIn_Add zusammenzählen...?!)Oscar : Guter Trick mit Int() gleich 18 stellige Zahlen zu berechnen!
lgE
-
Dann poste ich auch mal meine beiden letzten Versionen.
Ich bin mir nicht sicher, ob diese Scripte auch für beliebig lange Zahlen funktionieren...myBigInt_Size:
Spoiler anzeigen
[autoit]#include-once
[/autoit]
Func _BigInt_Add($a,$b)
If $a[0]<$b[0]Then
$S=$a
$a=$b
$b=$S
EndIf
For $i=1 To $a[0]
If $i>$a[0]-$b[0]Then $a[$i]+=$b[$i-($a[0]-$b[0])]
Next
Return $a
EndFunc
Func _BigInt_Mul($a,$b)
Local $E[$a[0]+$b[0]]=[$a[0]+$b[0]-1]
For $i=1 To $b[0]
For $j=1 To $a[0]
$E[$j+$i-1]+=$a[$j]*$b[$i]
Next
Next
Return $E
EndFunc
Func _BigInt_Load($a)
Return StringSplit($a,"")
EndFunc
Func _BigInt_Print($a,$E="",$R=0)
For $i=$a[0]To 1 Step -1
$a[$i]+=$R
$R=Floor($a[$i]/10)
$E=Mod($a[$i],10)&$E
Next
If $R>0 Then $E=$R&$E
If $E=0 Then $E="0"
Return $E
EndFuncmyBigInt_speed:
Spoiler anzeigen
[autoit]#include-once
[/autoit] [autoit][/autoit] [autoit]Global $L, $R, $E, $T, $i, $j, $C ;Ich verwende 1-stellige Variablen, da ich behaupte, daß das performanceverbesserungen bringt
[/autoit] [autoit][/autoit] [autoit]
;UND ich deklariere alle als Global, damit die Functions nicht erst deklarieren müssen...Func _BigInt_Add($a, $b)
[/autoit] [autoit][/autoit] [autoit]
$L = StringLen($b)
$T = StringLen($a)
$R=0
$E=""
If $L > $T Then $L=$T ;für die Schleife wird die kürzere Zahl genommen; Ich behaupte jetzt, daß die anderen Teilnehmer die längere Zahl verwendet haben...*g* - siehe "Return"
For $i = $L To 0 Step -15 ;Warum gerade 15? - wenn man Stringzahlen mit Auoit addiert, gehen max 14-stellige Zahlen (beim Benchmark 15 *g*); komischerweise funktionieren bei Integer 18-stellige Zahlen...
$T = StringRight($a, 15) + StringRight($b, 15) + $R ; Wird addiert lt. Schulmethode incl. Rest, welcher sich erst in der Schleife ergibt
$a = StringTrimRight($a, 15) ;verarbeitete Stellen steichen
$b = StringTrimRight($b, 15)
$R = Floor($T / 1000000000000000) ;Rest wird ermittelt
$T = Mod($T, 1000000000000000) ;Tatsächlicher Wert, der zu Ergebnis kommt
If $T <= 100000000000000 Then $T = StringRight("000" & $T, 15) ; Bei Rechenoperationen werden die führenden Nullen gestrichen, wir benötigen aber immer 15-stellige Strings (normallerweise sollten da 15 Nullen sein, bei Pee´s Benchmark reichen aber 3 :))
$E = $T & $E
Next
Return $a&$b&$E ;da ich die kürzere Zahl in der Schleife hab, muß ich den Rest der längeren Zahl vorne dran heften (ka, ob das immer funktioniert, beim Benchmark funzt´s - evtl fehlt bei anderen Zahlen mal ein Rest ?!)
EndFunc ;==>_BigInt_AddFunc _BigInt_Mul($a, $b) ;die Zahlen werden in ein Array gesplittet und dann lt Schulmethode berechnet; Siehe unten...
[/autoit] [autoit][/autoit] [autoit]
$a = _Split7($a)
$b = _Split7($b)
Local $E[$a[0] + $b[0]] = [$a[0] + $b[0] - 1] ;Die Stellenlänge bei MUL ist immer max. Länge_a + Länge_b
For $i = 1 To $b[0]
For $j = 1 To $a[0]
$E[$j + $i - 1] += $a[$j] * $b[$i] ;ich addiere die Multiplikationswerte im Array und lasse sie erst später mit _Merge7() zusammenfügen (Siehe ganz unten; geht das immer, oder kann der Wert die 14 Stellige Autoit-Grenze überscheiten??!)
Next
Next
Return _Merge7($E)
EndFunc ;==>_BigInt_MulFunc _Merge7($a) ; Addiert die einzelnen Array-Werte lt. Schulmethode, übergibt den Rest an die nächste usw...(im Prinzip wie bei _BigInt_add)
[/autoit] [autoit][/autoit] [autoit]
$E=""
$R=0
For $i = $a[0] To 1 Step -1
$a[$i] += $R
$R = Floor($a[$i] / 10000000)
$T = Mod($a[$i], 10000000)
If $i > 1 And $T <= 10000000 Then $T = StringRight("00" & $T, 7) ;wieder wie oben, nur halt 7-stellig...
$E = $T & $E
Next
If $R > 0 Then $E = $R & $E
If $E = 0 Then $E = "0"
Return $E
EndFunc ;==>_Merge7Func _Split7($a) ;Splittet die Zahl in ein Array mit jeweils 7-stelligen Zahlen; Warum 7 ?: weil 7+7=14 und 14-stellige Strings sind das Maximum, was Autoit addieren kann
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$L = StringLen($a)
$C = Ceiling($L / 7)
Local $E[$C + 1]
For $i = $L To 1 Step -7
$E[$C] = StringRight($a, 7)
$a = StringTrimRight($a, 7)
$C -= 1
Next
$E[0] = Ceiling($L / 7)
Return $E
EndFunc ;==>_Split7Func _BigInt_Load($a)
[/autoit] [autoit][/autoit] [autoit]
Return $a
EndFunc ;==>_BigInt_LoadFunc _BigInt_Print($a)
[/autoit] [autoit][/autoit] [autoit]
While StringLeft($a, 1) = "0" And StringLen($a) > 1 ;Führende Nullen werden gestrichen (ist schneller als StringRegExpReplace($X,"^[0-]*",""))
$a = StringTrimLeft($a, 1)
WEnd
Return $a
EndFunc ;==>_BigInt_Print;Zu Mul:
[/autoit]
;Bei der Schulmethode werden die einzelnen Zahlen multipliziert, der Rest weitergegeben und am Schluß die Teilergebnisse addiert... (das geht auch 7-stellig, hab ich in irgendeiner Version auch gemacht...)
;ich addiere die einzelnen Multiplikationen im Array und mach das mit dem Restübergeben erst bei _Merge7!
;wenn theoretisch ein Array den Wert von 14 Stellen überschreitet, dann gibts evtl. ein Problem! Beim Benchmark geht´s, aber geht das auch mit beliebig langen Zahlen?!?Passwort für meine anderen, hochgeladenen Versionen: ävSVZmnhZ93GWQ3!
lgE
-
*lol* - das erinnert mich an die Funktion Useless aus dem englischen Forum:
Spoiler anzeigen
[autoit]Func _Useless()
[/autoit]
EndFunc -
ich hatte mal eine usb-relaiskarte von mattronik
da ist eine dll dabei und ich habe die karte erfolgreich mit autoit angesteuert...
lgE
-
Um schneller zu spielen, kann man die Variablen $Sleep, $WMin und $WMax runtersetzen ($Sleep = 0, $WMin = 1, $WMax = 2)
Die Sounds sind normale WinXP-Sounds...Ähh, wie soll denn das ohne Maus gehen?
lgE
-
Um mich mal etwas ernsthafter mit GDI+ auseinanderzusetzen, hab ich ein 3D-Mensch ärgere dich nicht-Spiel geschrieben.
Hoffe, es gefällt[Blockierte Grafik: http://i38.tinypic.com/ir50cy.jpg]
es gäbe noch einige grafische Veränderungen zu machen, z.b. beim "Blinken" werden manchmal vordere Bildteile überzeichnet
oder die Farbringe stimmen nicht immer...usw...Das Spiel selber hab ich noch nicht auf Bugs getestet!
Die KI macht gar nichts als die erst beste Möglichkeit zu wählen.
Auch gibt es noch keinerlei Firlefanz, wie Computerspielgeschwindigkeit, Schwierigkeitsgrad, Multiplayer, Spielinfos, Sound-On/Off usw...
Beim ersten Druchgang sollte man 3 mal würfeln können.
.
.
.vielleicht mach ich ja irgendwann mal weiter
wer es ausprobieren will: einfach dort draufklicken, wo es blinkt
EDIT: Neu hochgeladen: LUDO.7z
lgE
-
zumindest @WorkingDir liefert unterschiedliche Verzeichnisse, jenachdem ob direkt oder via Reg gestartet...
-
Eigentlich verhält sich das Script gleich, jedoch ist das Arbeitsverzeichnis ein anderes.
Wenn man das Script direkt startet, dann reicht IniRead("Inidatei.ini"... weil das Arbeitsverzeichnis gleich dem Scriptverzeichnis ist.
Beim Start via Registry ist das Arbeitsverzeichnis ein anderes, darum: IniRead(@ScriptDir & "\IniDatei.ini"... sonst sucht er in C:\ oder EigeneDateien nach der Ini-Datei...*Ich hab das nicht ausprobiert, aber ich vermute mal, daß es so ist
-
Ich nehme mal an du meinst folgendes:
Du hast ein Script, welches einwandfrei läuft, wenn du es "normal" startest.
Aber wenn du es mit dem Registry-Eintrag "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" startest, dann findet dein Script die Ini-Datei nicht?!Dann hast du wahrscheinlich @Scriptdir vergessen: IniRead(@Scriptdir & "\IniDatei.ini...
Auch blöde Frage: Schreibst du an deinem Script auch mit der Bildschirmtastatur?
lgE
-
Hatte gerade mit einer VBR-Mp3 zu tun und mir ist folgendes aufgefallen:
Die Mp3 hatte eine durchschnittliche Bitrate von 158kbit/s.
VlC zeigte 128kbit/s, Windows 224kbit/s an! Beides konnte nicht stimmen.Die einfachste Möglichkeit, an die druchschnittliche Bitrate zu kommen, ist nun folgende:
Spoiler anzeigen
[autoit]#include "ExtProp.au3"
[/autoit]
$Mp3 = FileOpenDialog("Wähle eine Mp3-Datei aus", "", "Mp3 (*.mp3)", 1)
$Size = FileGetSize($Mp3)
$Length = _GetExtProperty($Mp3, 21)
$Split = StringSplit($Length, ":")
If @error Then Exit
$Sec = Int($Split[3])
$Sec += Int($Split[2]) * 60
$Sec += Int($Split[1]) * 60 * 60
$Bitrate = Round($Size / 1024 / $Sec *
MsgBox(0, $Mp3, $Bitrate)Die Bitrate wird anhand der Länge und Größe der Mp3 ausgerechnet
$Size / 1024 : von Byte zu Kilobyte
/ Sec : Kilobyte pro Sekunde
*8 : kiloByte zu KiloBitAllerdings ist das nur ein Näherungswert, da hier auch die ID3-Tags mitgerechnet werden!
Ich glaube ITunes speichert hier gern Bilder in die Mp3 - ein 5s Lied mit einem ID3v2-Tag von 8mb verfälscht das Ergebnis natürlich sehrExtProp.au3
Spoiler anzeigen
[autoit];===============================================================================
[/autoit]
; Function Name: GetExtProperty($sPath,$iProp)
; Description: Returns an extended property of a given file.
; Parameter(s): $sPath - The path to the file you are attempting to retrieve an extended property from.
; $iProp - The numerical value for the property you want returned. If $iProp is is set
; to -1 then all properties will be returned in a 1 dimensional array in their corresponding order.
; The properties are as follows:
; Name = 0
; Size = 1
; Type = 2
; DateModified = 3
; DateCreated = 4
; DateAccessed = 5
; Attributes = 6
; Status = 7
; Owner = 8
; Author = 9
; Title = 10
; Subject = 11
; Category = 12
; Pages = 13
; Comments = 14
; Copyright = 15
; Artist = 16
; AlbumTitle = 17
; Year = 18
; TrackNumber = 19
; Genre = 20
; Duration = 21
; BitRate = 22
; Protected = 23
; CameraModel = 24
; DatePictureTaken = 25
; Dimensions = 26
; Width = 27
; Height = 28
; Company = 30
; Description = 31
; FileVersion = 32
; ProductName = 33
; ProductVersion = 34
; Requirement(s): File specified in $spath must exist.
; Return Value(s): On Success - The extended file property, or if $iProp = -1 then an array with all properties
; On Failure - 0, @Error - 1 (If file does not exist)
; Author(s): Simucal ([email='Simucal@gmail.com'][/email])
; Note(s):
;
;===============================================================================
Func _GetExtProperty($sPath, $iProp)
Local $iExist, $sFile, $sDir, $oShellApp, $oDir, $oFile, $aProperty, $sProperty
$iExist = FileExists($sPath)
If $iExist = 0 Then
SetError(1)
Return 0
Else
$sFile = StringTrimLeft($sPath, StringInStr($sPath, "\", 0, -1))
$sDir = StringTrimRight($sPath, (StringLen($sPath) - StringInStr($sPath, "\", 0, -1)))
$oShellApp = ObjCreate ("shell.application")
$oDir = $oShellApp.NameSpace ($sDir)
$oFile = $oDir.Parsename ($sFile)
If $iProp = -1 Then
Local $aProperty[35]
For $i = 0 To 34
$aProperty[$i] = $oDir.GetDetailsOf ($oFile, $i)
Next
Return $aProperty
Else
$sProperty = $oDir.GetDetailsOf ($oFile, $iProp)
If $sProperty = "" Then
Return 0
Else
Return $sProperty
EndIf
EndIf
EndIf
EndFunc ;==>_GetExtPropertylgE
-
Spoiler anzeigen
[autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]$Bild = @DocumentsCommonDir & "\Eigene Bilder\Beispielbilder\Sonnenuntergang.jpg"
[/autoit] [autoit][/autoit] [autoit]
;$Bild=@ScriptDir & "\Test.bmp"GUICreate("Bild", 800, 600)
[/autoit] [autoit][/autoit] [autoit]
$hPic = GUICtrlCreatePic($Bild, 0, 0, 800, 600)
GUISetState()_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]
$hImage = _GDIPlus_ImageLoadFromFile($Bild)
$hGraphics = _GDIPlus_ImageGetGraphicsContext($hImage)
$IMGX = _GDIPlus_ImageGetWidth($hImage)
$IMGY = _GDIPlus_ImageGetHeight($hImage)
$hFormat = _GDIPlus_StringFormatCreate()
$hFamily = _GDIPlus_FontFamilyCreate("Arial")
$hFont = _GDIPlus_FontCreate($hFamily, 50, 1)For $Zahlen = 0 To 31
[/autoit] [autoit][/autoit] [autoit]
$hBrush = _GDIPlus_BrushCreateSolid("0x" & _RC() & _RC() & _RC() & _RC())
$tLayout = _GDIPlus_RectFCreate(Mod($Zahlen, * $IMGX / 8, Floor($Zahlen / * $IMGY / 4, 100, 100)
_GDIPlus_GraphicsDrawStringEx($hGraphics, $Zahlen + 1, $hFont, $tLayout, $hFormat, $hBrush)
Next_GDIPlus_ImageSaveToFile($hImage, @ScriptDir & "\Neu.bmp")
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_ImageDispose($hImage)
_GDIPlus_GraphicsDispose($hGraphics)
GUICtrlSetImage($hPic, @ScriptDir & "\Neu.bmp")
MsgBox(0, "", "Fertig")_GDIPlus_Shutdown()
[/autoit] [autoit][/autoit] [autoit]Func _RC()
[/autoit]
Return StringRight(Hex(Random(100, 255, 1)), 2)
EndFunc$hBrush = _GDIPlus_BrushCreateSolid:
0x11223344
11=Transparenz
22=Rot
33=Grün
44=Blau
Alle von 00 bis FFlgE
-
Naja, in diese Minimalbereiche kann ich mit meiner Methode nicht vorstoßen - die ist bei 0.12 ausgereizt.
Und solange mir kein anderer Algorithmus einfällt bleibt es also dabei.Bin ja gespannt, wie man multipliziert ohne zu addieren. Letztlich liegt doch jeder Rechenoperation eine Addition zugrunde. :wacko:
Ich hab ja nicht behauptet NICHT zu addieren, sondern ich verzichte auf _BigInt_Add!
Na, klingelt´s? -
Ich kenn die Programmiersprache auch nicht, aber "declspec" könnte doch folgendes bedeuten:
CodeFunction DllCallBy default, AutoIt uses the 'stdcall' calling method. To use the 'cdecl' method place ':cdecl' after the return type. DllCall("SQLite.dll", "int:cdecl", "sqlite3_open", "str", $sDatabase_Filename , "long*", 0).
also evtl:
[autoit]$dll = DllOpen("add.dll")
[/autoit]
$c = DllCall($dll,"double:cdecl","AddNumbers","double",$a,"double",$b)lgE