Code geht in Funktion nichtmehr

  • Hi,

    ich habe folgenden Code geschrieben. (Es wird ei CDDB-UDF benötigt):

    Spoiler anzeigen
    [autoit]

    #include <CDDB.au3>
    #include <Array.au3>

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

    While 1
    ;Auslesen der CD-Laufwerke auf dem Rechner
    $drives = DriveGetDrive('CDROM')
    ;Durchlaufen aller gefunden CD-Laufwerke
    For $i = 1 To $drives[0]
    ;Prüfen ob eine CD im Laufwerk ist
    If DriveStatus($drives[$i]) = 'READY' Then
    ;Laufwerk in dem die Musik-CD ist
    $abfrage = _CDDBCreateQuery($drives[$i])
    ;Abfrage wird durchgeführt
    $sDatabase = _FreeDBRecvDB($abfrage)

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

    ;Prüfen ob mehr als ein Treffer gefunden wurde
    If StringInStr($sDatabase, "211 Found inexact matches") Or StringInStr($sDatabase, "210 Found exact matches") Then
    ;Aufsplitten der gefundene Treffer in einem Array. Es werden von FreeDB nur die ersten 5 Treffer zurückgegeben
    $treffer = StringSplit($sDatabase, @CRLF, 3)

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

    ;Durchlaufen des Arrays
    For $x = 1 To 5 Step 1
    ;Aufschlüssel der Abfrage
    $aQuery = StringSplit($abfrage, " ")

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

    ;Aufschlüssel des Treffers
    $diskid = StringSplit($treffer[$x], " ")
    ;Ersetzen der Id in der Abfrage durch die neue id aus den Treffern
    $read = "cddb read " & $diskid[1] & " " & $diskid[2]
    Local $hSocket
    TCPSend($hSocket, $read & @CRLF)
    $sDatabase = __TCPRecv2($hSocket)
    ;Prüfen ob mehr als ein Treffer gefunden wurde
    If StringInStr($sDatabase, "211 Found inexact matches") Or StringInStr($sDatabase, "210 Found exact matches") Then

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

    Else

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

    ;Speichern der CD-Daten
    _FreeDBSplit($sDatabase)
    ExitLoop (3)
    EndIf
    Next
    EndIf
    EndIf
    Next
    WEnd

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

    Func _FreeDBSplit($sDatabase)
    ;Aufschlüssel der FreeDB rückgabe in einzelne Arrayelemente
    Local $ergebnis = StringSplit($sDatabase, @CRLF, 3)

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

    ;Auslesen der Interpreten und des Albumtitels
    Local $gruppealbum = _diskinfo("DTITLE", $ergebnis)
    $gruppealbum = StringSplit($gruppealbum, " / ", 3)

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

    ;Speicherort der Musikdaten
    DirCreate(@ScriptDir & "\" & $gruppealbum[0])
    Local $diskspeicher = @ScriptDir & "\" & $gruppealbum[0] & "\" & $gruppealbum[1] & ".ini"

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

    ;Auslesen der Gesamtmusiklänge
    Local $gesamtlaenge = _ArraySearch($ergebnis, "# Disc length: ", 0, 0, 0, 1)
    $gesamtlaenge = StringReplace($ergebnis[$gesamtlaenge], "# Disc length: ", "")

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

    ;Speichern der CD-ID
    IniWrite($diskspeicher, "Info", "id", _diskinfo("DISCID", $ergebnis))
    ;Speichern des Interpreten
    IniWrite($diskspeicher, "Info", "interpret", $gruppealbum[0])
    ;Speichern das Albumnames
    IniWrite($diskspeicher, "Info", "album", $gruppealbum[1])
    ;Speichern des Erscheinungsjahres
    IniWrite($diskspeicher, "Info", "jahr", _diskinfo("DYEAR", $ergebnis))
    ;Speichern des Genres
    IniWrite($diskspeicher, "Info", "genre", _diskinfo("DGENRE", $ergebnis))
    ;Speichern der Gesamtmusiklänge
    IniWrite($diskspeicher, "Info", "laenge", $gesamtlaenge)

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

    ;Auslesen des Musiktitel
    Local $titelid = _ArrayFindAll($ergebnis, "TTITLE", 0, 0, 0, 1)
    ;Auslesen des Titeloffsets
    Local $offsetsstart = _ArraySearch($ergebnis, "# Track frame offsets:", 0, 0, 0, 1)

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

    Local $offsetid = $offsetsstart

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

    ;Durchlauf des Musiktitelaaray
    For $titel In $titelid
    $offsetid += 1
    Local $offsetend = $offsetid + 1
    ;Auslesen des Endoffsets zum passenden Startoffsets
    $offetend = StringReplace($ergebnis[$offsetend], "# ", "")
    ;Beim letzten Titel wird als Endoffsets die Musikgesamtdauer gesetzt
    If @extended = 0 Then
    $offetend = $gesamtlaenge * 75
    EndIf

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

    ;Auslesen des Titels
    Local $name = StringSplit($ergebnis[$titel], "=", 2)
    ;Berechnen der Titellänge
    Local $titellaenge = Floor(($offetend - StringReplace($ergebnis[$offsetid], "# ", "")) / 75)
    ;Speichern von Titelnamen und Titellänge
    IniWrite($diskspeicher, "Titel", $name[1], $titellaenge)
    Next
    EndFunc ;==>_FreeDBSplit

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

    ;Funktion zum aussplitten der FreeDB-Daten
    Func _diskinfo($typ, $ergebnis)
    Local $return = StringReplace($ergebnis[_ArraySearch($ergebnis, $typ, 0, 0, 0, 1)], $typ & "=", "")
    Return $return
    EndFunc ;==>_diskinfo

    [/autoit]

    Nun wollte ich noch den Inhalt der While in eine Funktion machen, doch wenn ich das hier mache:

    Spoiler anzeigen
    [autoit]

    #include <CDDB.au3>
    #include <Array.au3>

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

    While 1
    _test()
    WEnd

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

    Func _test()
    ;Auslesen der CD-Laufwerke auf dem Rechner
    $drives = DriveGetDrive('CDROM')
    ;Durchlaufen aller gefunden CD-Laufwerke
    For $i = 1 To $drives[0]
    ;Prüfen ob eine CD im Laufwerk ist
    If DriveStatus($drives[$i]) = 'READY' Then
    ;Laufwerk in dem die Musik-CD ist
    $abfrage = _CDDBCreateQuery($drives[$i])
    ;Abfrage wird durchgeführt
    $sDatabase = _FreeDBRecvDB($abfrage)

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

    ;Prüfen ob mehr als ein Treffer gefunden wurde
    If StringInStr($sDatabase, "211 Found inexact matches") Or StringInStr($sDatabase, "210 Found exact matches") Then
    ;Aufsplitten der gefundene Treffer in einem Array. Es werden von FreeDB nur die ersten 5 Treffer zurückgegeben
    $treffer = StringSplit($sDatabase, @CRLF, 3)

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

    ;Durchlaufen des Arrays
    For $x = 1 To 5 Step 1
    ;Aufschlüssel der Abfrage
    $aQuery = StringSplit($abfrage, " ")

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

    ;Aufschlüssel des Treffers
    $diskid = StringSplit($treffer[$x], " ")
    ;Ersetzen der Id in der Abfrage durch die neue id aus den Treffern
    $read = "cddb read " & $diskid[1] & " " & $diskid[2]
    Local $hSocket
    TCPSend($hSocket, $read & @CRLF)
    $sDatabase = __TCPRecv2($hSocket)
    ;Prüfen ob mehr als ein Treffer gefunden wurde
    If StringInStr($sDatabase, "211 Found inexact matches") Or StringInStr($sDatabase, "210 Found exact matches") Then

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

    Else

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

    ;Speichern der CD-Daten
    _FreeDBSplit($sDatabase)
    ExitLoop (3)
    EndIf
    Next
    EndIf
    EndIf
    Next
    EndFunc ;==>_test

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

    Func _FreeDBSplit($sDatabase)
    ;Aufschlüssel der FreeDB rückgabe in einzelne Arrayelemente
    Local $ergebnis = StringSplit($sDatabase, @CRLF, 3)

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

    ;Auslesen der Interpreten und des Albumtitels
    Local $gruppealbum = _diskinfo("DTITLE", $ergebnis)
    $gruppealbum = StringSplit($gruppealbum, " / ", 3)

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

    ;Speicherort der Musikdaten
    DirCreate(@ScriptDir & "\" & $gruppealbum[0])
    Local $diskspeicher = @ScriptDir & "\" & $gruppealbum[0] & "\" & $gruppealbum[1] & ".ini"

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

    ;Auslesen der Gesamtmusiklänge
    Local $gesamtlaenge = _ArraySearch($ergebnis, "# Disc length: ", 0, 0, 0, 1)
    $gesamtlaenge = StringReplace($ergebnis[$gesamtlaenge], "# Disc length: ", "")

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

    ;Speichern der CD-ID
    IniWrite($diskspeicher, "Info", "id", _diskinfo("DISCID", $ergebnis))
    ;Speichern des Interpreten
    IniWrite($diskspeicher, "Info", "interpret", $gruppealbum[0])
    ;Speichern das Albumnames
    IniWrite($diskspeicher, "Info", "album", $gruppealbum[1])
    ;Speichern des Erscheinungsjahres
    IniWrite($diskspeicher, "Info", "jahr", _diskinfo("DYEAR", $ergebnis))
    ;Speichern des Genres
    IniWrite($diskspeicher, "Info", "genre", _diskinfo("DGENRE", $ergebnis))
    ;Speichern der Gesamtmusiklänge
    IniWrite($diskspeicher, "Info", "laenge", $gesamtlaenge)

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

    ;Auslesen des Musiktitel
    Local $titelid = _ArrayFindAll($ergebnis, "TTITLE", 0, 0, 0, 1)
    ;Auslesen des Titeloffsets
    Local $offsetsstart = _ArraySearch($ergebnis, "# Track frame offsets:", 0, 0, 0, 1)

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

    Local $offsetid = $offsetsstart

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

    ;Durchlauf des Musiktitelaaray
    For $titel In $titelid
    $offsetid += 1
    Local $offsetend = $offsetid + 1
    ;Auslesen des Endoffsets zum passenden Startoffsets
    $offetend = StringReplace($ergebnis[$offsetend], "# ", "")
    ;Beim letzten Titel wird als Endoffsets die Musikgesamtdauer gesetzt
    If @extended = 0 Then
    $offetend = $gesamtlaenge * 75
    EndIf

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

    ;Auslesen des Titels
    Local $name = StringSplit($ergebnis[$titel], "=", 2)
    ;Berechnen der Titellänge
    Local $titellaenge = Floor(($offetend - StringReplace($ergebnis[$offsetid], "# ", "")) / 75)
    ;Speichern von Titelnamen und Titellänge
    IniWrite($diskspeicher, "Titel", $name[1], $titellaenge)
    Next
    EndFunc ;==>_FreeDBSplit

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

    ;Funktion zum aussplitten der FreeDB-Daten
    Func _diskinfo($typ, $ergebnis)
    Local $return = StringReplace($ergebnis[_ArraySearch($ergebnis, $typ, 0, 0, 0, 1)], $typ & "=", "")
    Return $return
    EndFunc ;==>_diskinfo

    [/autoit]

    kommt immer dieser Fehler und ich finde einfach nicht den Grund dafür:

    Zitat

    : ==> Array variable subscript badly formatted.:
    Local $return = StringReplace($ergebnis[_ArraySearch($ergebnis, $typ, 0, 0, 0, 1)], $typ & "=", "")
    Local $return = StringReplace($ergebnis[^ ERROR


    Edit: Ok hab den Fehler gefunden. Problem war das $hSocket.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    2 Mal editiert, zuletzt von chip (9. Oktober 2010 um 17:29)