Array sortieren ;)

  • Hey Jungs und Mädels ;)

    Bin auch mal wieder da.

    Mein Problem (da es spät ist und ich grad nicht sooo viel denken will):
    Ich muss 2 Arrays ordnen - ich weiß, da gäbe es _ArraySort, aber ich brauch es bissl anders.

    Also ein Array ist gefüllt mit Namen, der andere mit den dazugehörigen Zahlen.
    Ich hätte das natürlich alles in einem 2dimensionalen-Array packen können, hab ich aber nicht ^^

    Frage: Wie kann ich nun die Zahlen im 2ten Array nach der größe anordnen, aber die verhältnisse zum ersten beibehalten?

    Also Beispiel

    $array[0] = "Fanta"
    $array[1] = "Peter"
    $array[2] = "wolf"

    $array2[0] = 5
    $array2[1] = 3
    $array2[2] = 20

    >>>

    $array[0] = "wolf"
    $array[1] = "Fanta"
    $array[2] = "Peter"

    $array2[0] = 20
    $array2[1] = 5
    $array2[2] = 3

  • Beim sortieren wird aber aber falsch sortiert ^^

    Also es würde net

    20
    5
    3

    kommen, sondern

    5
    3
    20

    naja..ich überleg mir morgen was schönes mit paar Schleifen.

    Gn8

  • Hm gute Idee :) Ich werd mich in meinen nächsten 3 Freistunden mal dran setzen ^^ Die hier sind schon fast vorbei ^^

    Edit: War wohl betrunken als ich das hier geschrieben hab xD

    3 Mal editiert, zuletzt von XxXFaNtA (18. September 2006 um 16:40)

  • Ich war heute morgen sehr verwirrt ^^

    Ich weiß auch, was er mit StringSplit meinte ;)

    Naja teilweise ^^

    Ich poste gleich mal den neuen Script im Edit ;)

    So..mein Script funktioniert jetzt zwar schön, aber ich muss den glaub ich trotzdem neuschreiben xD

    Hauptsache ich hab was von neues gelernt (StringFormat ^^)

    btw..ich bau grad ein Tool, welches die Kills etc bei CS:S notiert ;) Ohne ReadProcessMemory, da man ja sonst von VAC2 gebannt wird -.-

    Das hab ich bis jetzt:

    Spoiler anzeigen
    [autoit]


    ;-------------------------------------------------------------------------------;
    ; ;
    ; CS:S Stats ;
    ; Made by: XxXFaNtA ([email='xxxfanta2@freenet.de'][/email]) ;
    ; ;
    ; Next Things To Do: • About TrayItem ;
    ; • Saving Death In Weapon Trayitem ;
    ; • Total Damage/Total Hits/Most Damage/Most Hits ;
    ; ;
    ;-------------------------------------------------------------------------------;

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

    #include <File.au3>
    #include <Array.au3>
    #Include <Constants.au3>
    #NoTrayIcon

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

    AutoItSetOption("WinTitleMatchMode", 4)
    Opt("TrayAutoPause",0)
    Opt("TrayMenuMode",1) ; Default tray menu items (Script Paused/Exit) will not be shown.
    ;Opt("TrayOnEventMode",1)
    Opt("WinTitleMatchMode",4)

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

    ;; Veriablen deklarieren
    Global $name = ""
    Global $autostart = "Autostart: off"
    $i = 0

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

    Dim $weapon[29]
    Dim $weaponname[29]=["galil", "ak47", "scout", "sg552", "awp", "g3sg1", "famas","m4a1", "aug","sg550","glock","usp","p228","deagle","elite","fiveseven","m3", "xm1014","mac10","tmp","mp5navy","ump45","p90","m249","hegrenade", "flashbang","smokegrenade","knife"]
    Dim $weaponitem[29]

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

    ;wird verändert...er wird alle Werte zusammenrechnen
    $kills = IniRead(@AppDataDir & "\css Stats\stats.ini","stats","totalkills",0)
    $death = IniRead(@AppDataDir & "\css Stats\stats.ini","stats","totaldeath",0)
    $suicide = IniRead(@AppDataDir & "\css Stats\stats.ini","stats","totalsuicides",0)

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

    ;; Create file if it doesn't exist
    If FileExists(@AppDataDir & "\css Stats\stats.ini") = 0 Then
    $creatingfile = FileOpen (@AppDataDir & "\css Stats\stats.ini",1)
    For $i = 0 To UBound($weapon)-2
    IniWrite(@AppDataDir & "\css Stats\stats.ini","stats",$weaponName[$i],0)
    Next
    IniWrite(@AppDataDir & "\css Stats\stats.ini","stats","totalkills",0)
    IniWrite(@AppDataDir & "\css Stats\stats.ini","stats","totaldeath",0)
    IniWrite(@AppDataDir & "\css Stats\stats.ini","stats","totalsuicides",0)
    IniWrite(@AppDataDir & "\css Stats\stats.ini","settings","Autostart",0)
    EndIf
    ;;

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

    $SteamDir = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Valve\Steam","InstallPath")

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

    ; Shortcut maker
    FileCreateShortcut($steamDir & "\Steam.exe",@DesktopDir & "\Counter-Strike Source.lnk",$SteamDir,"-applaunch 240 -console -condebug","",$SteamDir &"\Steam\Games\Counter-Strike Source.ico")
    ; Check if XFire exists to change games Entry
    $xfiredir = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Xfire","")
    If Not $xfiredir = "" Then
    IniWrite($xfiredir & "\xfire_games.ini", "4331", "Launch", "%UA_LAUNCHER_EXE_PATH% -applaunch 240 -console -condebug %UA_LAUNCHER_EXTRA_ARGS% %UA_LAUNCHER_NETWORK_ARGS%")
    EndIf
    ;;

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

    $Username = IniRead(@AppDataDir & "\css Stats\stats.ini","settings","name","")
    While $username = ""
    $username = InputBox("Username","To use this Script, we will need your Steam Username (no password!)","XxXFaNtA")
    WEnd
    IniWrite(@AppDataDir & "\css Stats\stats.ini","settings","name",$username)

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

    $file = FileOpen ($SteamDir &"\SteamApps\" & $username & "\counter-strike source\cstrike\console.log",2) ;deleting the old chatlog
    FileClose($file)

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

    $file = FileOpen ($SteamDir &"\SteamApps\" & $username & "\counter-strike source\cstrike\console.log",0)
    $filepath = $SteamDir &"\SteamApps\" & $username & "\counter-strike source\cstrike\console.log"
    $log = FileRead($file)
    $CountLines = _FileCountLines($SteamDir &"\SteamApps\" & $username & "\counter-strike source\cstrike\console.log")
    $countLinesOld = $countlines

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

    ; Tray Menu!
    TraySetIcon("icon.ico")
    $settingsitem = TrayCreateMenu("Settings")

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

    #region AutoStart
    ;;AutoStart stuff
    If IniRead(@AppDataDir & "\css Stats\stats.ini","settings","Autostart",-1) = 0 Then
    RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run","cssstats")
    $autostart = "Autostart: off"
    ElseIf IniRead(@AppDataDir & "\css Stats\stats.ini","settings","Autostart",-1) = 1 Then
    $reg = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run","cssstats")
    If @error = -1 Then
    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run","cssstats","REG_SZ",@ScriptFullPath)
    EndIf
    $autostart = "Autostart: on"
    EndIf
    ;; End Autostart
    #endregion

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

    ; Reading the Old Data (out of the ini)
    For $i = 0 To UBound($weapon)-2
    $weapon[$i] = IniRead(@AppDataDir & "\css Stats\stats.ini","stats",$weaponName[$i],0)
    Next
    ;;;;;;;;;;;;;;;;;;;;;;;;

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

    $autostartitem = TrayCreateItem($Autostart, $settingsitem,-1)
    $nameitem = TrayCreateItem("Change Username",$settingsitem,-1)
    TrayCreateItem("",$settingsitem,-1)
    $resetitem = TrayCreateItem("Reset Stats",$settingsitem,-1)
    TrayCreateItem("")
    $weaponmenu = TrayCreateMenu("Weapons")
    $SortItem = TrayCreateItem("Sort: None",$weaponmenu,-1)
    TrayCreateItem("",$weaponmenu,-1)
    For $i = 0 To Ubound($weaponname)-2
    $weaponitem[$i] = TrayCreateItem($weaponname[$i] & ": " & @TAB & $weapon[$i],$weaponmenu,-1)
    Next
    $totalmenu = TrayCreateMenu("Total Stats")
    $totalkillsitem = TrayCreateItem("Total kills:" & @TAB & $kills,$totalmenu,-1)
    $totaldeathitem = TrayCreateItem("Total death:" & @TAB & $death,$totalmenu,-1)
    $totalsuicideitem = TrayCreateItem("Total suicides:" & @TAB & $suicide,$totalmenu,-1)
    TrayCreateItem("",$totalmenu,-1)
    If $death = 0 Then
    $KDitem = TrayCreateItem("Kill/Death-Ratio:" & @TAB & "0",$totalmenu,-1)
    Else
    $KDitem = TrayCreateItem("Kill/Death-Ratio:" & @TAB & Round($kills/$death,2),$totalmenu,-1)
    EndIf
    TrayCreateItem("")
    $exititem = TrayCreateItem("Exit")

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

    While 1
    ; Beim Change in der Config Waffendaten ändern.
    $CountLines = _FileCountLines($SteamDir &"\SteamApps\" & $username & "\counter-strike source\cstrike\console.log")
    If $countlinesOld <> $countlines Then
    For $i = $countlinesOld + 1 To $countlines Step 1
    ;--Old Stuff
    $line = FileReadLine($file,$i)
    If StringInStr($line,"Player: ") <> 0 AND StringInStr($line," - Damage Given") Then; Getting the Name - Name Changing included
    $name = StringTrimLeft($line,8)
    $name = StringTrimRight($name,15)
    ElseIf StringInStr($line,$name & " killed",1) <> 0 Then ; Getting the kills
    $kills += 1
    ;;Weapons
    $weaponSplit = StringSplit($line," ") ;Teilt den String in einem Array auf, wobei Waffennamen = letzter Array eintrag
    $weaponNameNew = StringTrimRight($WeaponSplit[$weaponSplit[0]],1) ;nimmt sich den Waffennamen und hakt "." ab
    For $j = 0 to Ubound($weapon)-1 ;; Schauen, ob und wo die Waffe schon in dem Array gespeichert wurde.
    If $weaponname[$j] = $WeaponNameNew Then ; Wenn der Waffenname dem eines im Array übereinstimmt:
    $weapon[$j] += 1 ; 1 Kill für diese Waffe adden
    $weaponnewvalue = IniRead(@AppDataDir & "\css Stats\stats.ini","stats",$weaponname[$j],0)
    IniWrite(@AppDataDir & "\css Stats\stats.ini","stats",$weaponname[$j],$weaponnewvalue+1)
    ExitLoop
    EndIf
    Next
    ElseIf StringInStr($line," killed " & $name,1) <> 0 Then
    $death += 1
    ElseIf StringInStr($line,$name & " suicided.") <> 0 Then
    $suicide += 1
    EndIf
    Next
    ;; Saving the Total-Stats in the ini and rewriting the Data for the WeaponStats in the Traymenu
    #region Restarting Total-Stats
    IniWrite(@AppDataDir & "\css Stats\stats.ini","stats","totalkills",$kills)
    TrayItemSetText($totalkillsitem,"Total kills:" & @TAB & $kills)
    IniWrite(@AppDataDir & "\css Stats\stats.ini","stats","totaldeath",$death)
    TrayItemSetText($totaldeathitem,"Total death:" & @TAB & $death)
    IniWrite(@AppDataDir & "\css Stats\stats.ini","stats","totalsuicides",$suicide)
    TrayItemSetText($totalsuicideitem,"Total suicides:" & @TAB & $suicide)
    #endregion
    For $i = 0 To Ubound($weaponname)-2
    TrayItemSetText($weaponitem[$i],$weaponname[$i] & ": " & @TAB & $weapon[$i])
    Next
    ; K/D-Ratio Trayitem
    If NOT $death = 0 Then
    TrayItemSetText($kditem,"Kill/Death-Ratio:" & @TAB & Round($kills/$death,2))
    EndIf
    EndIf
    $countLinesOld = $countLines

    ;----------------- TRAY MENU ----------------
    $msg = TrayGetMsg()
    Select
    Case $msg = $autostartitem

    If $autostart == "Autostart: on" Then
    RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run","cssstats")
    IniWrite(@AppDataDir & "\css Stats\stats.ini","settings","Autostart",0)
    $autostart = "Autostart: off"
    TrayItemSetText($autostartitem,$autostart)
    Else
    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run","cssstats","REG_SZ",@ScriptFullPath)
    IniWrite(@AppDataDir & "\css Stats\stats.ini","settings","Autostart",1)
    $autostart = "Autostart: on"
    TrayItemSetText($autostartitem,$autostart)
    EndIf
    Case $msg = $resetitem
    $reset = MsgBox(4,"Resetting Data","Are you sure to Reset your Stats?")
    If $reset = 6 Then
    For $i = 0 To UBound($weapon)-2
    $weapon[$i] = IniWrite(@AppDataDir & "\css Stats\stats.ini","stats",$weaponName[$i],0)
    $kills = 0
    $death = 0
    $suicide = 0
    IniWrite(@AppDataDir & "\css Stats\stats.ini","stats","totalkills",0)
    IniWrite(@AppDataDir & "\css Stats\stats.ini","stats","totaldeath",0)
    IniWrite(@AppDataDir & "\css Stats\stats.ini","stats","totalsuicides",0)
    TrayItemSetText($weaponitem[$i],$weaponname[$i] & ": " & @TAB & "0")
    TrayItemSetText($totalkillsitem,"Total kills:" & @TAB & "0")
    TrayItemSetText($totaldeathitem,"Total death:" & @TAB & "0")
    TrayItemSetText($totalsuicideitem,"Total suicides:" & @TAB & "0")
    TrayItemSetText($kditem,"Kill/Death-Ratio:" & @TAB & "0")
    Next
    EndIf
    Case $msg = $SortItem
    If TrayItemGetText ($SortItem) = "Sort: None" Then
    TrayItemSetText($sortitem,"Sort: Descending")

    ; Kills Sortieren
    For $i = 0 To Ubound($weapon)-2
    $weapon[$i] = StringFormat("%06i",$weapon[$i]) & $weaponname[$i]
    Next
    _ArraySort($weapon,1)
    For $i = 0 To Ubound($weapon)-2
    $weaponName[$i] = StringMid($weapon[$i],7,StringLen($weapon[$i])-6)
    $weapon[$i] = StringMid($weapon[$i],1,6)
    If $weapon[$i] > 0 Then
    $weapon[$i] = Number($weapon[$i])
    Else
    $weapon[$i] = 0
    EndIf
    TrayItemSetText($weaponitem[$i],$weaponname[$i] & ": " & @TAB & $weapon[$i])
    Next
    _ArrayDisplay($weapon,"Sorted")
    _ArrayDisplay($weaponName,"Sorted Names")
    EndIf
    Case $msg = $nameitem
    $username = InputBox("Username Change","Please enter the new Username",$username)
    IniWrite(@AppDataDir & "\css Stats\stats.ini","settings","name",$username)
    Case $msg = $exititem
    Exit
    EndSelect
    Wend

    [/autoit]

    2 Mal editiert, zuletzt von XxXFaNtA (18. September 2006 um 13:20)

  • Neue Frage...Ich zerbrech mir gleich den Kopf ^^

    [autoit]

    If TrayItemGetText ($SortItem) = "Sort: Descending" Then
    ; Kills Sortieren
    For $i = 0 To Ubound($weapon)-2
    $weapon[$i] = StringFormat("%06i",$weapon[$i]) & $weaponname[$i]
    Next
    _ArraySort($weapon,1)
    For $i = 0 To Ubound($weapon)-2
    $weaponName[$i] = StringMid($weapon[$i],7,StringLen($weapon[$i])-6)
    $weapon[$i] = Number(StringMid($weapon[$i],1,6))
    TrayItemSetText($weaponitem[$i],$weaponname[$i] & ": " & @TAB & $weapon[$i])
    Next
    ElseIf TrayItemGetText ($SortItem) = "Sort: Ascending" Then
    For $i = 0 To Ubound($weapon)-2
    $weapon[$i] = StringFormat("%06i",$weapon[$i]) & $weaponname[$i]
    Next
    _ArraySort($weapon,0)
    For $i = 0 To Ubound($weapon)-2
    $weaponName[$i] = StringMid($weapon[$i],7,StringLen($weapon[$i])-6)
    $weapon[$i] = Number(StringMid($weapon[$i],1,6))
    TrayItemSetText($weaponitem[$i],$weaponname[$i] & ": " & @TAB & $weapon[$i])
    Next
    EndIf

    [/autoit]

    Was ich machen will: Kills auf/absteigend sortieren (übers Traymenu ändert man halt auch den Text des TrayMenuItems)...

    Der Fehler: er zeigt mir oben ein blankes Feld an..ich habe nun verschiedenste andere Zahlen versucht...100 Sachen..ich bin langsam echt stinkig ^^

    Könnte mir da jemand weiterhelfen?

    Ich poste auch gerne den ganzen Post, damit ihr ihn mal testen könnt ;)

    2 Mal editiert, zuletzt von XxXFaNtA (18. September 2006 um 23:35)

    • Offizieller Beitrag

    Hallo,

    hat es einen besonderen Grund das du bei den For-Schleifen 2 von Ubound($weapon) abziehst? Wenn du alle Elemente verarbeiten willst sollte da Ubound($weapon) - 1 stehen, das könnte natürlich dein Problem sein wenn das letzte Element nicht belegt ist. Lass dir doch mit _ArrayDisplay den Inhalt vor und nach dem sortieren ausgeben!

  • Das ja alles das komische. Es ging ja mit dem -2 immer...ich weiß es selbst kaum noch, warum ich Ubound - 2 hab..jedenfalls ging es so ^^ Evtl Array falsch gedimt..

    Jedenfalls miot Ubound - geht es nicht.
    Wenn ich Array anzeige, zeigt er mir ja an, dass von 1-28 die Namen sind und 0 ist blank.
    Achja..und der letzte Eintrag im Array wird nicht gesplittet etc :\


    Hab da auch schon etliche Sachen versucht :(

    Ich muss wohl bald den ganzen Script nochmal von vorne durchgehen


    Okay..jetzt wo ich den Array um 1 verkleinert hab, geht alles Prima...3 Stunden Streß und Wut sind nun vorbei ^^

    thx :> Ich melde mich wieder, wenn ich ne Code-Optimierung brauche :D

    2 Mal editiert, zuletzt von XxXFaNtA (19. September 2006 um 14:01)