Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Function im dll verhält sich seltsam

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
hge2001



Anmeldungsdatum: 26.02.2008
Beiträge: 18

BeitragVerfasst am: 17.05.2012, 18:56    Titel: Function im dll verhält sich seltsam Antworten mit Zitat

Hallo,

Ich habe eine allgemeine Funktion, die einen String als ergebnis liefert in ein .DLL verlagert.

Ich stelle nun fest, dass ich diese Funktion max 256 mal aufrufen kann, danach wird immer nur ein leerer String zurückgegeben. Ich kann das auch mit einer simplen funktion simulieren

function retString(X as long) as string EXPORT
retString = "Ergebnis"
end function

von einem Hauptprogramm kann ich das 256 mal aufrufen,danach gibt es nur noch einen leeren String. Ich benutze FB 0.23.0

Gibt es dafür eine Erklärung?

Danke für Eure Hilfe

HGE
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 17.05.2012, 21:07    Titel: Antworten mit Zitat

Hi,
die Rückgabe von Strings aus einer DLL geht am sichersten über einen ZString Ptr.
Als DLL:
Code:
Declare Function retString() As ZString Ptr

Function retString() As ZString Ptr Export
  retString = @("Ergebnis")
End Function

als Testprogramm:
Code:
Declare Function retString Lib "test_str"() As ZString Ptr

For i As Integer = 1 To 400
  Print i, *retString
Next
sleep

Warum es bei Übergabetyp "String" nur 256 mal funktioniert kann ich dir leider nicht erklären.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
hge2001



Anmeldungsdatum: 26.02.2008
Beiträge: 18

BeitragVerfasst am: 18.05.2012, 05:29    Titel: Antworten mit Zitat

@volta

Danke für den Vorschlag... so werde ich es machen.

hge
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 18.05.2012, 06:48    Titel: Antworten mit Zitat

Alternativ über ByRef in der Parameterliste.


MfG
TPM

PS: ich nutze selbiges unter linux mit .so's .. und habe dort keine probs damit. Eventuell ein bug in der win version von fbc?!
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 18.05.2012, 11:04    Titel: Antworten mit Zitat

Hi,
der 'ZString Ptr' workaround ist auch nur begrenzt möglich (mit konstanten Strings).
Es scheint ein Bug in der Windowsversion des FBC zu sein.
Über eine SUB geht es auch mit zusammen gesetzten Strings
Code:
Declare sub retString(a As Integer, s As String)

sub retString(a As Integer, s As String) Export
  s = "Ergebnis" + Str(a)
End Sub

Code:
Declare sub retString(a As Integer, s As String)

Dim s As String
For i As Integer = 1 To 400
  retString(i,s)
  Print s,
Next
sleep

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 18.05.2012, 14:26    Titel: Antworten mit Zitat

Probier es doch mal mit FB 0.24. Ist zwar noch nicht released, aber hier gibt es unter "Übergangslösung" ein aktuelles Paket. Vielleicht wurde der Bug ja inzwischen gefixt, daher könnte es etwas bringen den 0.24 zu nehmen.
_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dkl
FreeBASIC-Compiler-Entwickler


Anmeldungsdatum: 25.04.2010
Beiträge: 14
Wohnort: Germany

BeitragVerfasst am: 18.05.2012, 15:51    Titel: Antworten mit Zitat

Wie es aussieht ist das Übergeben von FB Strings zwischen DLL und .exe im Moment nicht wirklich möglich. FB benutzt ja ständig temporäre FB string Deskriptoren, die aber rtlib-spezifisch sind und nicht in einem rtlib (DLL) erstellt und im anderen (.exe) freigegeben werden können. Wenn man es doch macht bekommt man memory leaks (Deskriptoren und Inhalte), und außerdem sind im Moment nur 256 temporäre Deskriptoren erlaubt, danach gehen die gar nicht mehr.

Unter Linux wird das Problem wohl auch auftauchen, sobald mehrere rtlibs im Spiel sind, ich glaube das betrifft dann .so's die per dylibload() geladen wurden. Ich befürchte das ganze lässt sich erst fixen wenn FB strings richtige Objekte sind, das wird aber ein Riesenumbau in FB compiler/rtlib, und für FB 0.24 will ich sowas jedenfalls nicht mehr riskieren.

Es gibt im Moment zwei mögliche work-arounds:

Code:
'' Byref string parameter, aber sicherstellen das dem niemals ein temporärer
'' string zugewiesen wird, sondern nur string Variablen
sub foo( byref funcresult as string )
   dim as string result

   result = foo

   funcresult = result
end sub


Code:
'' Zstring Ptr anstatt String zurückgeben
function foo( ) as zstring ptr export
   static as string result

   result = "foo"

   function = strptr( result )
end function


FB strings direkt zurückgeben scheidet leider komplett aus, weil dabei immer ein temporärer Deskriptor benutzt wird.

Edit: Dieser 3. work-around mit String Ptr wird wohl auch laufen, ist schneller als der Zstring Ptr:
Code:
'' String Ptr anstatt String zurückgeben
function foo( ) as string ptr export
   static as string result

   result = "foo"

   function = @result
end function
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hge2001



Anmeldungsdatum: 26.02.2008
Beiträge: 18

BeitragVerfasst am: 18.05.2012, 16:54    Titel: Antworten mit Zitat

dkl hat Folgendes geschrieben:
Edit: Dieser 3. work-around mit String Ptr wird wohl auch laufen, ist schneller als der Zstring Ptr:
Code:
'' String Ptr anstatt String zurückgeben
function foo( ) as string ptr export
   static as string result

   result = "foo"

   function = @result
end function


Vielen Dank für die Unterstüzung von "höchster Stelle".

Workaround 3 leuchtet auch mir - als kein Compiler Spezialist - ein .
Wenn mir auch etwas grummelig wird, wenn ich mir vorstelle, dass der Pointer von der . exe in die .dll verweist.
Static ist hier das Zauberwort, weil es die (Wieder)Anlage von flüchtigen strings verhindert. Ich hoffe, dass ich das richtig verstanden habe.

Gruss

hge
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz