Problem: Externer Code + GC + Strings

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Artemis

Betreff: Problem: Externer Code + GC + Strings

BeitragMi, Jan 21, 2009 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink)
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) {
   return artemis_ipod__UTF82Max(track->title);
}
artemis_ipod__UTF82Max ist folgende Funktion:
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.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group