ID3-Skript Problem - "Error allocating memory."-Error

  • Hey@All
    Habe ein Problem mit meinem Skript, denn es gibt einen "Error allocating memory." Fehler aus.
    Ich möchte den Titel und den Artist einfach nur bearbeitet einfügen.
    Hier mein Skript:

    Spoiler anzeigen
    [autoit]

    #include <ID3.au3>
    #include <File.au3>
    $title="ID3 Fast Runner"
    $folder=FileSelectFolder("Please select folder...","::{20D04FE0-3AEA-1069-A2D8-08002B30309D}",2)
    $Files=_GetFileList($folder,"*.mp3")
    ;$syntax="<artist>*-*<title>"
    ;--> * means "", " ", " ", " ", ...
    _ArrayDisplay($Files)

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

    For $i=1 To UBound($Files)-1
    _ID3ReadTag($Files[$i],0,-1,2)
    $title=_ID3GetTagField("TIT2")
    $artist=_ID3GetTagField("TPE1")
    $name=StringSplit($Files[$i],"\")
    $name=$name[UBound($name)-1]
    If StringRegExp($name,"(.+)-(.+)")=1 Then
    $temp=StringSplit($name,"-")
    $CorArtist=""
    $CorTitle=""
    If Not @error Then
    $CorTitle=$temp[2]
    $CorTitle=_ReturnCorrectName($title)
    $CorArtist=$temp[1]
    $CorArtist=_ReturnCorrectName($artist)
    EndIf
    EndIf
    _ID3SetTagField("COMM","tags changed by "&$title)
    If $CorTitle<>"" Then
    ;MsgBox(0,$Files[$i],$title&$CorTitle)
    _ID3SetTagField("TIT2",$CorTitle)
    ConsoleWrite($CorTitle&"--")
    EndIf
    If $CorArtist<>"" Then
    ;MsgBox(0,$Files[$i],$artist&$CorArtist)
    _ID3SetTagField("TPE1",$CorArtist)
    ConsoleWrite($CorArtist&@CRLF)
    EndIf
    _ID3WriteTag($Files[$i])
    ;_ID3DeleteFiles()
    Next
    MsgBox(0,$title,"Finished.")

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

    Func _GetFileList($T_DIR,$T_MASK,$DIR_ONLY=0)
    Dim $N_DIRNAMES[200000] ; max number of directories that can be scanned
    Local $N_DIRCOUNT = 0
    Local $N_FILE
    Local $N_SEARCH
    Local $N_TFILE
    Local $N_OFILE
    Local $T_FILENAMES
    Local $T_FILECOUNT
    Local $T_DIRCOUNT = 1
    ; check Filemask \ for empty File-Array by GetDirOnly
    If $T_MASK = "n" Then $T_MASK = "*.no"
    ; remove the end \ If specified
    If StringRight($T_DIR,1) = "\" Then $T_DIR = StringTrimRight($T_DIR,1)
    $N_DIRNAMES[$T_DIRCOUNT] = $T_DIR
    ; Exit if base dir doesn't exists
    If Not FileExists($T_DIR) Then Return 0
    ; keep on looping until all directories are scanned
    While $T_DIRCOUNT > $N_DIRCOUNT
    $N_DIRCOUNT = $N_DIRCOUNT + 1
    ; find all subdirs in this directory and save them in a array
    $N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\*.*")
    While 1
    $N_FILE = FileFindNextFile($N_SEARCH)
    If @error Then ExitLoop
    ; skip these references
    If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
    $N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
    ; if Directory than add to the list of directories to be processed
    If StringInStr(FileGetAttrib( $N_TFILE ),"D") > 0 Then
    $T_DIRCOUNT = $T_DIRCOUNT + 1
    $N_DIRNAMES[$T_DIRCOUNT] = $N_TFILE
    EndIf
    Wend
    FileClose($N_SEARCH) ; find all Files that mtach the MASK
    $N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\" & $T_MASK )
    If $N_SEARCH = -1 Then ContinueLoop
    While 1
    $N_FILE = FileFindNextFile($N_SEARCH)
    If @error Then ExitLoop
    ; skip these references
    If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
    $N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
    ; if Directory than add to the list of directories to be processed
    If StringInStr(FileGetAttrib( $N_TFILE ),"D") = 0 Then
    $T_FILENAMES = $T_FILENAMES & $N_TFILE & @CR
    $T_FILECOUNT = $T_FILECOUNT + 1
    ;MsgBox(0,'filecount ' & $T_FILECOUNT ,$N_TFILE)
    EndIf
    Wend
    FileClose($N_SEARCH)
    Wend
    If $DIR_ONLY = 0 Then
    $T_FILENAMES = StringTrimRight($T_FILENAMES,1)
    $N_OFILE = StringSplit($T_FILENAMES,@CR)
    Return( $N_OFILE )
    Else
    ReDim $N_DIRNAMES[$N_DIRCOUNT+1]
    $N_DIRNAMES[0] = $N_DIRCOUNT
    Return $N_DIRNAMES
    EndIf
    EndFunc ;==>_GetFileList

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

    Func _StringToArray($string)
    $z=StringLen($string)
    If $z=0 Then
    Dim $array[1]
    Else
    Dim $array[$z]
    For $i=1 To $z
    $array[$i-1]=StringTrimRight($string,$z-$i)
    $array[$i-1]=StringTrimLeft($array[$i-1],$i-1)
    Next
    EndIf
    Return $array
    EndFunc

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

    Func _ReturnCorrectName($v)
    $array=_StringToArray($v)
    $last=-1
    $last2=-1
    For $i=1 To UBound($array)-1
    If $array[$i]="" Then
    $last=$i
    Else
    $last2=$i
    ExitLoop
    EndIf
    Next
    If $last<$last2 And $last>-1 And $last2>-1 Then
    For $i=1 To $last
    _ArrayDelete($array,$i)
    Next
    EndIf
    ;_ArrayDelete($array,0)
    ;_ArrayDisplay($array,"ReturnCorrectname")
    Return _ArrayToString($array,"")
    EndFunc

    [/autoit]


    Die ID3-UDF gibst hier: http://www.autoitscript.com/forum/index.php?showtopic=43950
    MfG AntiSpeed

    Nur keine Hektik - das Leben ist stressig genug

  • Hallo Antispeed,

    die von dir beschriebene Fehlermeldung kommt bei mir nicht, dafür aber folgende:

    Code
    >"C:\Programme\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "C:\Programme\AutoIt3\Examples\Tests\ID3TagAntiSpeed.au3" /autoit3dir "C:\Programme\AutoIt3" /UserParams    
    +>23:39:55 Starting AutoIt3Wrapper v.2.0.1.24    Environment(Language:0407  Keyboard:00000407  OS:WIN_XP/Service Pack 3  CPU:X86 OS:X86)
    >Running AU3Check (1.54.19.0)  from:C:\Programme\AutoIt3
    +>23:39:56 AU3Check ended.rc:0
    >Running:(3.3.6.1):C:\Programme\AutoIt3\autoit3.exe "C:\Programme\AutoIt3\Examples\Tests\ID3TagAntiSpeed.au3"    
    C:\Programme\AutoIt3\Examples\Tests\ID3TagAntiSpeed.au3 (28) : ==> Variable used without being declared.:
    If $CorTitle <> "" Then
    If ^ ERROR
    ->23:40:32 AutoIT3.exe ended.rc:1
    >Exit code: 1    Time: 37.980


    Ich gehe bei der von dir beschriebenen Fehlermeldung davon aus, dass der ausgewählte Ordner zu viele MP3 's enthält und deshalb nicht genügend HauptSpeicher zur Verfügung steht,

    mfg (Auto)Bert

  • Neein.
    Bei mir kommt bei Scite unten in dem Dings da keine FehlerMeldung. Es kommt eine MSG mit Titel "autoit" und dann diese Msg. In dem Ordner befinden sich nur 8 oder 9 dateien (alles mp3s).
    Bei mir kommt nicht diese FehlerMeldung. ?( Es muss woanders dran liegen...
    MfG AntiSpeed

    Nur keine Hektik - das Leben ist stressig genug

    • Offizieller Beitrag

    denn es gibt einen "Error allocating memory." Fehler aus.


    Die Fehlerausgabe teilt dir auch immer mit, von welchem Skript und welcher Skriptzeile der Fehler verursacht wird.
    - Ist es die UDF oder dein Skript?
    - An welcher Position entsteht der Fehler?

    Schon mal alle Zeilen auf evtl. Fehlerausgaben geprüft?
    (In SciTE kannst du über <Extras> <Trace: Add trace lines> nach jeder Skriptzeile eine Ausgabe des Fehlerwertes in die Console bewirken)

  • Hey.
    Also ihr glaub mir es ja nie...
    Hier ein ScreenShot. (Bei 8 Lieder)
    [Ein Mal ist der PC sogar fast hängen geblieben wegen dem Skript, es kam die Nachtricht nicht, aber ich konnte heit nix mehr machen...]
    @Sprenger: "~1,1 GB", also meine Dateien sind 90,3 MB (94.695.040 Bytes) groß.
    Auch wenn es jetzt an dieser Größe hängen würde, wie kann ich es denn anders Lösen? Ist die Funktion von BugFix etwa der "Fehler"?

  • @Sprenger: Omg...

    Zitat

    Hier mein Skript:


    Aber wie kann ich es denn hinbekommen, dass es keinen "Überlauf" des Speichers gibt?
    BugFix :

    Zitat

    Ich rate mal:
    Ein rekursiver Aufruf, der sich totläuft?


    Also du hast die Funktion ja erweitert, könnte also daran liegen.
    Wäre schön, wenn du dir mal mein Skript genauer anguckst. thx

    Nur keine Hektik - das Leben ist stressig genug

    2 Mal editiert, zuletzt von Antispeed (13. Juli 2010 um 13:13)

    • du gehst ja nicht auf Rückmeldungen und Tipps ein
    • Also du bist ja [Edit eingefügt: (Auto)Bert nicht mehr] neu hier: Dieses Forum ist schon so "fortgeschritten", dass es einen Edit-Button gibt, und man nicht immer einen neuen Post machen muss. Dh, wenn man was ergänzen will, dann Edit und man macht einen neue Zeile und schreibt davor "Edit:" und dann den Text. Hat jmd. nach dem Post aber was geschrieben kann man schreiben: "Guck auf den vorheriegen Post." oder in diesem Fall einfach es so machen wie du, nur -wie gesagt- nicht 3Posts nacheinander. Währe nett wenn dus einhalten könntest.

    wäre nett wenn du die dir gegebenen Hinweise beachten würdest,

    mfg (Auto)Bert

  • autoBert:
    Aber wenn ich einfach nur einen Edit machen, dann sieht keiner mehr den Thread & ich komme nie zu einer Lösung.
    Die einzigste Rückmeldung, die hilft ist die von BugFix. Da er sich ja gut damit auskennnt (hat die Funk. überarbeitet), weiß er ja dass es zu einem rekursivem Aufruf, der sich totläuft kommt. Jetzt möchte ich aber wissen, wie man das vermeiden kann oder wenns nicht anders geht, dann versuchen zu einer anderen Lösung zu kommen.
    PS: Währe nett, wenn du die Lösung weißt, dass du sie postest. THX.
    MfG AntiSpeed

    Nur keine Hektik - das Leben ist stressig genug

  • Zitat

    Aber wenn ich einfach nur einen Edit machen, dann sieht keiner mehr den Thread & ich komme nie zu einer Lösung.


    Pushen ist unerwünscht.

    Zitat

    Da er sich ja gut damit auskennnt (hat die Funk. überarbeitet), weiß er ja dass es zu einem rekursivem Aufruf, der sich totläuft kommt.


    BugFix hat das vermutet, weiß aber nicht, ob es wirklich dazu kommt.
    Du hast ja nicht einmal gesagt, wo in deinem Skript der Fehler auftritt. Z.B. ist es wichtig zu wissen, ob er vor oder nach dem ArrayDisplay erscheint.

    Außerdem gibt es viele andere rekursive FileList-Funktionen, da kannst du mal eine andere testen...

  • BugFix :

    Zitat
    Ich rate mal:
    Ein rekursiver Aufruf, der sich totläuft?


    Also du hast die Funktion ja erweitert, könnte also daran liegen.

    Die einzigste Rückmeldung, die hilft ist die von BugFix. Da er sich ja gut damit auskennnt (hat die Funk. überarbeitet), weiß er ja dass es zu einem rekursivem Aufruf, der sich totläuft kommt.

    Bevor du die Schuld bei BugFix suchst, solltest du auch andere Möglichkeiten in Betracht ziehen:

    Im Id3v2 Tag können große Datenmengen gespeichert sein (z.B.: Coverbilder)
    Vielleicht liegt das Problem ja hier...

    noch dazu da die letzte Zeile der Scite Console alesana beautiful in blue ausgibt. Ob die Funktion von BugFix funktioniert, kannst du auch ohne die ID3Tag-Prozeduren prüfen. Wenn das Array (Zeile 10) angezeigt wird hat seine Funktion (_GetFileList, ich finde hier im übrigen keinen Hinweis im Quellcode, dass diese Funktion von ihm geschrieben/erweitert wurde) ihren Dienst bereits getan. Lösche/verschiebe also dieses Lied und dein Skript wird bis zu der von mir beschriebenen Fehlermeldung kommen, dagegen hilft

    [autoit]

    Global $CorTitle, $CorTitle, $CorArtist

    [/autoit]

    direkt nach den Includes einzufügen,

    mfg (Auto)Bert