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:

Über- und Rückgabe von Float Werten in DLL

 
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
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 24.02.2008, 19:42    Titel: Über- und Rückgabe von Float Werten in DLL Antworten mit Zitat

Hi zusammen,

ich möchte gerne in FB eine DLL machen die ich von BlitzBasic aus nutzen will. Ich kann soweit alle Werte nach FB übergeben, nur die Rückgabe von Float Werten klappt nicht und ich weis nicht warum.

Die Funktion sieht bei mir so aus:

Code:
Public Function MeinFloat Cdecl ( F As Single ) As Single Export


Hierbei kommt der Float Wert von Blitz in FB an, hab ich mir ausgeben lassen - geht. Aber in Blitz bekomme ich einen Memory Access Violation bei Aufruf der Funktion und ich konnte es soweit eingrenzen das es an der Rückgabe liegt, also AS SINGLE EXPORT.

Hat das schonmal jemand hinbekommen?
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 24.02.2008, 23:00    Titel: Antworten mit Zitat

Ums nochmal zu spezifizieren hier der gesamte Quellcode:

Code:
Declare Function MeinFloat   Lib "FB-BB" Alias "MeinFloat"   ( ByVal A As Single, ByVal B As Single ) As Single
Declare Function MeinString  Lib "FB-BB" Alias "MeinString"  ( S As ZString Ptr )         As ZString Ptr
Declare Function MeinInteger Lib "FB-BB" Alias "MeinInteger" ( I As Integer )             As Integer
Declare Function MeineBank   Lib "FB-BB" Alias "MeineBank"   ( B As Any Ptr )             As Integer

'Hier wird ein Float empfangen und zurück gegeben
Function MeinFloat ( ByVal A As Single, ByVal B As Single ) As Single Export
   
   If A > B Then B = A
   Function = B
   
End Function

'Hier wird ein String empfangen und zurück gegeben
Function MeinString ( S As ZString Ptr ) as ZString Ptr Export
   
   'auf den String greifen wir über den Pointer zu
   *S = "Ich habs empfangen"
   
   'wir geben einen String wieder zurück
   Return S
   
End Function

'Hier wird ein Integer empfangen und zurück gegeben
Function MeinInteger ( I As Integer ) As Integer Export
   
   'Wir geben den Wert 1234 an BlitzBasic zurück
   Return 1234
   
End Function

'Hier wird eine Speicherbank empfangen und die gefüllte Bank sowie ein Integer zurückgegeben
Function MeineBank ( B As Any Ptr ) As Integer Export
   
   Dim i As Integer
   
   'Wir füllen die Speicherbank mit Werten
   For i = 0 To 15
      
      Poke Byte, B + i, 255 - i
      
   Next
   
   Return 1
   
End Function


Warum zu Henker geht die Float Funktion nicht? Ich hab mal einen anderen Quellcode ausprobiert und compiliert - da gehts. Wenn ich diesen Code hier compiliere gehts nicht - ist doch nicht normal - oder?
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 25.02.2008, 15:59    Titel: Antworten mit Zitat

Hmmm,
ich habe deinen Quellcode als FB-BB.dll compiliert und hiermit getestet:
Code:
DECLARE FUNCTION MeinFloat   LIB "FB-BB" ALIAS "MeinFloat"   ( BYVAL A AS SINGLE, BYVAL B AS SINGLE ) AS SINGLE
DECLARE FUNCTION MeinString  LIB "FB-BB" ALIAS "MeinString"  ( S AS ZSTRING PTR )         AS ZSTRING PTR
DECLARE FUNCTION MeinInteger LIB "FB-BB" ALIAS "MeinInteger" ( I AS INTEGER )             AS INTEGER
DECLARE FUNCTION MeineBank   LIB "FB-BB" ALIAS "MeineBank"   ( B AS ANY PTR )             AS INTEGER

Dim As Single erst=0.5, zweit=1.5
?MeinFloat (erst, zweit)
?MeinFloat (2.7, zweit)
sleep
keine Probleme unter FB018.3, ME . Alles OK!!
_________________
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
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 25.02.2008, 16:00    Titel: Antworten mit Zitat

Ich weiß nicht, inwiefern das auf BB zutrifft, allerdings weiß ich, dass man CDECL in Libs verwenden sollte, falls sie von anderen compilern als FBC benutzt werden. Schreib einfach mal CDECL an der Funktion und prüfe dann, ob es klappt.
_________________
Code:
#include "signatur.bi"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 25.02.2008, 16:12    Titel: Antworten mit Zitat

Wenn BB DLLs mit der Aufrufkonvention CDECL verlangt muss dies bei der Erstellung der DLL in FB auch angegeben werden.
Normal (ohne Angabe) benutzt FB STDCALL .

EDIT/
hier http://www.blitzbase.de/tabellen/history.htm Version 1.77 steht:
Zitat:
Der DLL-Aufruf-Modus "CDECL" wurde um "STDCALL" erweitert. CDECL-DLL's werden mit C erstellt. STDCALL-DLL's können dagegen mit allen Programmiersprachen geschrieben werden. Die Erkennung der DLL geschieht automatisch.
Es sollte also in BB ohne CDECL (evtl. mit STDCALL) funktionieren.
_________________
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
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 25.02.2008, 18:49    Titel: Antworten mit Zitat

Also es funktionieren beide Varianten von BB aus. MIttlerweile hab ich rausgefunden das es gar nicht an der Float Funktion, sondern an der String Funktion lag. Da gibt es eine Merkwürdigkeit.

Wenn ich eine DLL Funktion erstelle die nur einen einzelnen String übergibt, dann kann ich diesen Beispielsweise als "T As String" übergeben.

Übergebe ich neben dem String noch mehrere Parameter, z.B. den Pointer auf eine Bank, dann muß ich "T As ZString" machen. In jedem anderen Fall bekomme ich eine Schutzverletzung (bzw. einen MAV) unter BlitzBasic - das finde ich komisch.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
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