Problem: Externer Code + GC + Strings
Übersicht

![]() |
ArtemisBetreff: Problem: Externer Code + GC + Strings |
![]() Antworten mit Zitat ![]() |
---|---|---|
Moin,
im moment versuche ich die libgpod-Bibliothek zum syncen von iPods für BlitzMax zu wrappen. Diese liegt als C-Code vor. Jetzt bekomme ich aber beim Abrufen von Strings aus der Bibliothek Probleme mit dem Garbage Collector. Folgender Code: Code: [AUSKLAPPEN] SuperStrict
Framework Artemis.iPod Import Brl.StandardIO Local database:TiPodDatabase = New TiPodDatabase.Create("G:\") If Not database Then Print "ERROR: Please modify your iPod-Path" End EndIf For Local track:TiPodTrack = EachIn database.tracks Print GCMemAlloced() + "~t~t" + track.getTitle() Next TiPodDatabase repräsentier einfach die iPod-Datenbank, TiPodTrack einen Track in der Datenbank. Dieser Code gibt folgendes aus (nein, diese Musik höre ich nicht ![]() Code: [AUSKLAPPEN] …
17922 Historia d'amor (Love story) 18132 Wilde Rosen 18312 Dieses Leben 18542 Was, wenn ich dich liebe 3504 b 3614 3724 3834 z … Soll heißen, bis zu einem bestimmten Punkt kommen richtige Werte raus, (und GCMemAlloced steigt ständig) und wenn dann der allozierte Speicher kleiner wird (der GC hat aufgeräumt schätze ich) kommt nur noch Müll raus. Das interessante ist, dass es im debug-Modus nichts passiert, dass GCMemAlloced sinkt, sondern es steigt immer weiter. Und es kommen überall richtige Strings raus. Damit ihr das ganze nachvollziehen könnte, gibts das Modul entweder per svn oder als zip. Diejenigen, die keinen iPod haben können auch einfach folgendes Archiv auf einem beliebigen Laufwerk ins oberste Verzeichnis packen und dann dieses Laufwerk bei New TiPodDatabase.Create("???") angeben: iPod_Control.zip Und falls man ohne viel Aufwand den Fehler so sehen kann eine kurze Erläuterung: track.getTitle() sieht so aus (self.pointer ist ein byte ptr auf ein C-Struct): BlitzMax-Code: [AUSKLAPPEN] Method getTitle:String()
If Self.pointer Try Return bmx_itdb_track_get_title(Self.pointer) Catch exception:Object DebugLog("! Artemis.iPod.TiPodTrack.getTitle: bmx_itdb_track_get_title: " + exception.toString()) EndTry EndIf EndMethod C-Code: [AUSKLAPPEN] BBString * bmx_itdb_track_get_title(Itdb_Track * track) {
artemis_ipod__UTF82Max ist folgende Funktion:
return artemis_ipod__UTF82Max(track->title); } BlitzMax-Code: [AUSKLAPPEN] Function _UTF82Max:String(s:Byte Ptr)
Local l:Int = _strlen(s) Local b:Short[] = New Short[l] Local bc:Int = -1 Local c:Int Local d:Int Local e:Int For Local i:Int = 0 Until l bc:+1 c = s[i] If c<128 b[bc] = c Continue End If i:+1 d=s[i] If c<224 b[bc] = (c-192)*64+(d-128) Continue End If i:+1 e = s[i] If c < 240 b[bc] = (c-224)*4096+(d-128)*64+(e-128) If b[bc] = 8233 Then b[bc] = 10 End If Continue End If Next Return String.FromShorts(b, bc + 1) End Function track->title ist ein char *. Ich habe keine Ahnung, wie ich dem Programm mehr Informationen abpressen kann, damit ich herausfinden kann, warum da anscheinend BlitzMax-Aufräumaktionen den C-Code verwirren. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group