Hi,
es ist vollbracht(nicht die Installation der neuen Beta 3.1.125, mit der dies alles auch funktioniert..):
Ich habe endlich meinen QSort soweit, daß ich damit sortieren kann, fast wie ich möchte:
-aufwärts
-abwärts
Ich brauchte einen QSort, um die SIDs vom myGetSID() zu sortieren
(von hier stammt auch das zu sortierende File).
Der AutoIt-QSort versagt hier, da die Strings nicht numerisch bewertet werden.
Es macht nun wenig Sinn, wegen eines Problems eine System-Func zu ändern,
also mußte eine Neue her(das war im 1. Versuch Bubble-Sort). Schlauerweise
habe ich hier den Vergleich in eine Extra-Func kleiner() ausgelagert, da ich die
dann auch im QSort() verwenden konnte. Das hat aber nichts genutzt. Der BubbleSort
funktionierte und der QSort nicht! Das gibts doch nicht..
Bis ich auf einmal feststellte, das der QSort nicht FALSCH sortierte, sondern GAR NICHT.
Dann wars kein Problem mehr:Einfach byREF in die Func-Zeile eingefügt und schon kann der
QSort die geänderten Werte auch zurückgeben. Klasse..
Die Funktion kleiner() ist nur für die Bearbeitung von SIDs ausgelegt, wer andere Sachen
sortieren will, muß die Func entsprechend anpassen.
Wenn ein einfacher Textvergleich ausreichend ist, einfach die erste Zeile von kleiner()
entkommentieren und fertig..
Der Einbau in GetSIDGUI ist bereits erledigt..
[Edit]
Toll, dies ist mein 111. Posting
Gruß
ytwinky
Spoiler anzeigen
;program QSort;
;(c)longtime ago by someone who could program in pascal
;program QSort.Pas has been successfully ported to QSort.au3
Dim $DateiName="C:\AutoIt3\au3\QSort.Txt", $dp, $s, $l, $i, $t, $Feld
$Feld=StringReplace(_ReadAll($DateiName), @LF, "")
$t=StringSplit($Feld, @CR)
BubbleSort($t, 1, $t[0])
$s=""
For $i=1 To $t[0]
$s&=$t[$i] &@Cr
Next
MsgBox(4096,"BubbleSort", $s)
$t=StringSplit($Feld, @CR)
QSort($t, 1, $t[0], ">")
$s=""
For $i=1 To $t[0]
$s&=$t[$i] &@Cr
Next
MsgBox(4096,"QSort", $s)
Exit
Func _ReadAll($DateiName)
;2006 By ytwinky
Local $ForReading=0, $Size, $DateiHnd, $Warte=3000, $i, $s, $j
If FileExists($DateiName) Then
$DateiHnd=FileOpen($DateiName, $ForReading)
If $DateiHnd<0 Then
MsgBox(4096, "Ooops:", "Datei " &$DateiName &" läßt sich nicht öffnen..", $Warte)
Exit 1
Else
$Size=FileGetSize($DateiName)
If $Size>0 Then ;da is was drin..
$Size=FileRead($DateiHnd, $Size)
FileClose($DateiHnd)
Return $Size
Else ;da is nix drin
MsgBox(4096, "Ooops:", "Datei " &$DateiName &" ist leer..", $Warte)
Exit 1
EndIf
EndIf
Else
MsgBox(4096, "Ooops:", "Datei " &$DateiName &" nicht gefunden..", $Warte)
Exit 1
EndIf
EndFunc
Func QSort(byRef $Feld, $l, $r, $Compare="<") ;gt jetz auch..
If IsArray($Feld) Then
Dim $i=$l, $j=$r, $y, $x=$Feld[Int($l+$r)/2]
Do
While kleiner($Feld[$i], $x, $Compare)
$i+=1
Wend
While kleiner($x, $Feld[$j], $Compare)
$j-=1
Wend
If $i<=$j Then
$y=$Feld[$i]
$Feld[$i]=$Feld[$j]
$Feld[$j]=$y
$i+=1
$j-=1
EndIf
Until $i>$j
If $l<$j Then QSort($Feld, $l, $j, $Compare)
If $i<$r Then QSort($Feld, $i, $r, $Compare)
Else
MsgBox(4099, "Fehler", "$Feld ist kein Array")
EndIf
EndFunc
Func BubbleSort(byRef $Feld, $l, $r) ; ist Ok, mit Kleiner zusammen..
Dim $i, $j, $y
For $i=$l To $r
For $j=$i To $r
If Not kleiner($Feld[$i], $Feld[$j]) Then
$y=$Feld[$i]
$Feld[$i]=$Feld[$j]
$Feld[$j]=$y
EndIf
Next
Next
EndFunc
Func kleiner($a, $b, $Compare="<") ;< also 'kleiner' Vergleich(aufsteigend)..
; Return $a<$b
If $a<>$b Then
Dim $arra=StringSplit(StringLeft($a, StringInstr($a, @Tab)-1) &"-0", "-") ;Nur SID splitten
Dim $arrb=StringSplit(StringLeft($b, StringInstr($b, @Tab)-1) &"-0", "-") ;Nur SID splitten
Dim $i, $j
If IsArray($arra) And IsArray($arrb) Then
$j=$arra[0]
If $arrb[0]>$j Then
$j=$arrb[0]
EndIf
For $i=3 To $j
If $i>$arra[0] Or $i>$arrb[0] Then Return True
If ($arra[$i]*1)<>($arrb[$i]*1) Then
Switch $Compare
Case "<"
Return $arra[$i]*1<$arrb[$i]*1
Case ">"
Return $arra[$i]*1>$arrb[$i]*1; abwärts sortieren
EndSwitch
EndIf
Next
EndIf
EndIf
Return False
EndFunc
Alles anzeigen