Bin leider nicht zuhause, um das gleich mal auszuprobieren...
Hab aber auf´m alten Laptop Ubuntu 8.4 (und auch Kubuntu, Vista, XP & Win2k) drauf...
werd das morgen gleich mal testen...
lgE
Bin leider nicht zuhause, um das gleich mal auszuprobieren...
Hab aber auf´m alten Laptop Ubuntu 8.4 (und auch Kubuntu, Vista, XP & Win2k) drauf...
werd das morgen gleich mal testen...
lgE
Hallo Spezialisten ![]()
Ich hab eine externe HDD, WesternDigital Passport 250GB.
Die ist werksmäßig auf Fat32 formatiert.
Irrtümlich hab ich sie auf NTSF formatiert (unter WinXP) und seither kommt beim kopieren die Fehlermeldung "Sektor nicht gefunden"!
Mit einem WD-Tool hab ich die Werksformatierung Fat32 widerhergestellt - Fehlermeldung bleibt jedoch.
Unter Windows kann ich die Platte nur mit Quickformat formatieren, bei normalem Format tut sich gar nichts...
Ich will jetzt mal ausschließen, daß die Platte physikalisch defekt ist.
Kann es sein, daß die Formatierung falsche Sector und Head Werte verwendet?
thx für alle Hinweise
Eukalyptus
Probier mal nur @CR oder nur @LF bei StringSplit
lgE
Wie wärs mit: 1 Wort ändern und 1 Wort hinzufügen?
z.b.: Unter diesem Niveau hofft mein Koalabär auf...
Unter diesem Niveau tanzt der Koalabär ![]()
Auf diesem Baum tanzt der Koalabär ![]()
Auf diesem Forum tanzt der Bär
@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ückgegeben
Ich 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!
;===werden benötigt=============================================================
#include<String.au3>
#include<WindowsConstants.au3>
#include<Misc.au3>
;===============================================================================
;===Beispiel 1 (komplettes Verzeichnis kopieren)================================
; 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)
For $i= 1 to $Ret[0]
MsgBox(0, "Dateien überschreiben", $i & " / " & $Ret[0] & @CRLF & $Ret[$i])
Next
;===============================================================================
;===Beispiel 2 (mehrere Dateien kopieren)=======================================
; 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)
For $i= 1 to $Ret[0]
MsgBox(0,"Vorhandene Dateien umbenennen", $i & " / " & $Ret[0] & @CRLF & $Ret[$i])
Next
;===============================================================================
;===============================================================================
;
; 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 ;==>_MultiFileCopy
Func __ProgressCreate(ByRef $aMFC)
$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 ;==>__ProgressCreate
Func __Progress($FileSize, $BytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
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
;==================================================================================================
; 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
EndFunc
Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
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
EndFunc
Auß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-Datei
3)Wie Methode 2, nur via MemoryWrite / MemoryRead
4)GUI1 verwende GuiRegisterMsg mit der enstsprechenden Bildänderfunktion
GUI2 Sende die Message an GUI1
5)GUI2 schreibt in StdOut
GUI1 ließt Stdin
lgE
Schau dir mal die Hilfe zu Opt("",) an
lgE
Oscar : Doch! Den Trick hast nur du benutzt.
Autoit kann 18 stellige Zahlen berechnen (64Bit), doch Stringzahlen gehen nur bis 14 stellen!?!
$String_a="999999999999999999"
$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.
#include-once
[/autoit] [autoit][/autoit] [autoit]Global $L, $R, $E, $T, $i, $j, $C
[/autoit] [autoit][/autoit] [autoit]Func _BigInt_Add($a, $b)
$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_Add
Func _BigInt_Mul($a, $b)
$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_Mul
Func _Merge7($a)
$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 ;==>_Merge7
Func _Split7($a)
$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 ;==>_Split7
Func _BigInt_Load($a)
Return $a
EndFunc ;==>_BigInt_Load
Func _BigInt_Print($a)
While StringLeft($a, 1) = "0" And StringLen($a) > 1
$a = StringTrimLeft($a, 1)
WEnd
Return $a
EndFunc ;==>_BigInt_Print
Ich versuch mal meine Multiplikation zu erklären, anhand 456*123:
Schulmethode:
456*123
---------
45600
.9120
..1368
-------
56088
hier 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 gleich
Meine 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 = 18
nun 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]=
56088
Die 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:
#include-once
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
EndFunc
myBigInt_speed:
#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 ![]()
;UND ich deklariere alle als Global, damit die Functions nicht erst deklarieren müssen...
Func _BigInt_Add($a, $b)
$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_Add
Func _BigInt_Mul($a, $b) ;die Zahlen werden in ein Array gesplittet und dann lt Schulmethode berechnet; Siehe unten...
$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_Mul
Func _Merge7($a) ; Addiert die einzelnen Array-Werte lt. Schulmethode, übergibt den Rest an die nächste usw...(im Prinzip wie bei _BigInt_add)
$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 ;==>_Merge7
Func _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
$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 ;==>_Split7
Func _BigInt_Load($a)
Return $a
EndFunc ;==>_BigInt_Load
Func _BigInt_Print($a)
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:
;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:
Func _Useless()
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...