Parameterübergabe an Dll/userlib

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Olaf_France

Betreff: Parameterübergabe an Dll/userlib

BeitragMi, Feb 24, 2021 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

Ich habe ein paar Fragen zur Parameterübergabe an userlib-Funktionen und Daten-Handhabung

1. Sind (globale) Variabeln und Structures(Types), in einer Dll deklariert, auch im Hauptprogramm sichtbar?
Oder muss ich Diese auch im Hauptprogramm deklarieren?
2. Wenn ich den Type sowohl im Hauptprogramm als auch in der Dll deklariere, muss der Datentyp Namensgleich
sein, d.h. im Hauptprogramm
Type abc
Field x%
End Type

in der Dll
Structure def
x.i
EndStructure

Dll-Function :
Procedure DoThis(var.def)


Aufruf im Hauptprogramm :
DoThis(var.abc)

Da beide Structures/Types den gleichen Feldtyp und Grösse haben,würde das funktionieren?
Ich denke, es wird doch nur die StartAdresse des Types übergeben, und da die Struktur des Types 'abc'
und Die der Structure 'def' gleich sind, sollte es gehen, Oder????



Olaf
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus

Olaf_France

BeitragFr, Feb 26, 2021 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

Ich brauche ein paar generelle Infos zu dem Thema!

bis jetzt habe ich ein paar userlib's für mich geschrieben, nach dem Muster:
func#(a#,b%)
Das war auch kein Problem!
Nun soll es etwas umfangreicher werden,und dazu möchte ich mehrere Parameter übergeben,
aber auch zurück erhalten.
Dazu habe ich folgenden dll-Code geschrieben
Code in PureBasic!
Code: [AUSKLAPPEN]
ProcedureDLL.i testpoint(*mry) ;ProcedureDll.i = sichtbare Function in Dll,.i = return integer
  Protected wi.f,lng.f,cx.f,sy.f;*mry = zeiger auf Memory/Bank
  If MemorySize(*mry)>8 Or MemorySize(*mry)<8
    Debug MemorySize(*memo)
    ProcedureReturn -1         ;ProcedureReturn = Return
  Else   
    Debug "poken"
    wi=PeekF(*mry)
    lng=PeekF(*mry+4)
     cx=Cos(wi)*lng
     sy=Sin(wi)*lng
     PokeF(*mry,cx)
     PokeF(*mry+4,sy)
     ProcedureReturn 1
   EndIf
EndProcedure


die .decls ist

.lib "testmrylib.dll"

testpoint(mry)

der Code in B+
Code: [AUSKLAPPEN]
;Stop
ra#=50
wk#=0.64350110292435

memo=CreateBank(8)
If BankSize(memo)>8 Or BankSize(memo)<8
   Notify("ERROR!",1)
Else
   PokeFloat(memo,0,wk)
   PokeFloat(memo,4,ra)
   
EndIf

testpoint(memo);wink,Radius

an#=PeekFloat(memo,0)
ge#=PeekFloat(memo,4)

FreeBank(memo)

Print"Radius="+ra
Print"Ankathede="+an
Print"Gegnkathede="+ge


WaitKey()


Das Prg brich tab sobald die lib-Function aufgerufen wird!

was läuft da schief???

Olaf
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus

Thunder

BeitragDo, März 04, 2021 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Pointer enthält keine Information über die Größe des Speicherbereichs. Deswegen war ich schon Mal stutzig, dass du MemorySize darauf aufrufst. Wenn du in die PureBasic Dokumentation zu MemorySize schaust, steht da auch in der Beschreibung des Parameters:

Zitat:
The address of the memory area to get the size from. This must be a value returned from either AllocateMemory() or ReAllocateMemory().


Edit: Link: https://www.purebasic.com/docu...ysize.html

Dein Pointer kommt aber von einer B+ Bank, daher wird das Programm dort crashen.

Die Moral von der Geschicht? Entweder du hardcodest die Größe des Speicherbereichs (und dokumentierst das am besten in einem Kommentar zu der Funktion), oder du übergibst einen extra integer für die Größe.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Olaf_France

BeitragDo, März 04, 2021 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
OOHH Sche...e!!!

Da hab ich jetzt einiges durcheinander geschmissen!!

Test in PB ok ,klar is ne (im Test) globale MemoryVariable

und dann structure/type und speicher(types sind in meinem kopf immer structuredMemory.

also die Bank soll einen type abbilden,der hat als ersten eintrag seine grösse!
aber wenn man diese nicht ausliesst,.......

wäre ja schön,wenn man alles in einer Basic schreiben könnte,
aber leider kann PureBasic nicht so gut mit Images wie BB,da ist BB immer noch besser!!!

Auf der anderen Seite ist die Structure in PB besser ,da ich nicht automatisch eine list brauche

Ohne 'Handle' und 'Object' wäre es in BB,für mich sehr schwer, den richtigen eintrag zu finden

Pointer in PB, BB ???

Bon, Memorysize auslesen, dann klappt das auch mit der ... Embarassed

Danke Merci
Olaf
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus

Thunder

BeitragDo, März 04, 2021 16:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Gerne. Hast du schon BlitzMax oder Monkey probiert? Da kannst du die Typen auch ohne Linked List verwenden und zum Beispiel ein Array nehmen oder sie manuell in eine TList fügen.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Olaf_France

BeitragDo, März 04, 2021 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe B-Max, aber ich bin damit noch nicht so 'warm' geworden.
Oop ist zwar kein Problem, aber irgendwie ist das 'Disign' von Max
etwas gewöhnungsbedürftig.
Ausserdem habe ich schon eine Sammlung an Routinen, die ich für
die Userlib geschrieben habe, und somit B+ erweitern möchte via Lib's

Olaf
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group