Prototype - Parameterproblem

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Prototype - Parameterproblem

Beitrag von gnasen »

Hi,
in der Hilfe steht zum Thema Prototypes folgendes:
es erfolgt eine Typen-Überprüfung, die Anzahl an Parametern wird geprüft.
Ich möchte es ermöglichen einer DLL Callbacks zu übergeben, um die Funktionalität zu erweitern. Allerdings erhalte ich sowohl über den DLL Weg (noch zu verschmerzen) als auch über den direkten Weg böse Speicherzugriffsverletzungen.

Code: Alles auswählen

Prototype mycallback(parameter.i)

Procedure setcallback(proc.i)
  Protected test.mycallback = proc
  test(5)
EndProcedure

Procedure test(a.i,b.i); <------ Pfui
  MessageRequester(Str(a),Str(b))
EndProcedure

setcallback(@test())
Ich möchte die Prototypes nutzen, um die Parameter zu überprüfen. Theoretisch kann ich test.mycallback doch nur Funktionen mit einem Parameter zuweisen. Ansonsten sollte irgendwas passieren (meinetwegen eine Zuweisung von Null -> Man könnte "falsche" Funktionen abfangen)
Liegt der Fehler bei mir oder ist da etwas nicht ganz in Ordnung?

Edit:
Gibt es eine andere Möglichkeit eine Funktion auf ihr Paramenter zu überprüfen?
pb 4.51
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Prototype - Parameterproblem

Beitrag von edel »

gnasen hat geschrieben:Hi,
in der Hilfe steht zum Thema Prototypes folgendes:
es erfolgt eine Typen-Überprüfung, die Anzahl an Parametern wird geprüft.
Das macht aber der Compiler selber und geschieht nicht zur Laufzeit.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

gibt es denn eine Möglichkeit sowas zu realisieren?
pb 4.51
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Vielleicht sowas ?

Code: Alles auswählen

;DLL oder Include

Prototype pHoleDaten(a, b, Array c(1))
   Global HoleDaten.pHoleDaten 

Procedure DLLprozedur(adresse,x)

If x: a = 1: EndIf

Dim dtn(0)                ; sehr wichtig muß hier definiert werden
HoleDaten = adresse       ;Prototype Zeiger 
HoleDaten(a, @b, dtn())

Debug b
Debug dtn(1)

EndProcedure


;Hauptprogramm

Procedure xyz(a, *b.INTEGER, Array dtn(1))
; bekommt a 
; gibt b und füllt Array

max = 31
Dim dtn(max)  ;Datenfeld

dtn(1) = 11

If a = 1
   *b\i = 25
Else
   *b\i = 15
EndIf

EndProcedure

DLLprozedur(@xyz(),1)

mit DLLs hab ichs noch nicht getestet, mit einer IncludeDatei gehts perfect.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Vielleicht habe ich etwas übersehen, aber soweit ich das sehe ist das ein erweitertes Beispiel für das was ich oben gemacht hatte :lol:

Das meines nicht funktioniert ist ja extra, es soll so nicht funktionieren. Edel sagte ja schon, dass die Parameterprüfung von Prototypes während des Compilevorgangs statt findet.

Meine Frage ist, ob es einen anderen Weg gibt, einen Aufruf wie oben (welcher nicht erlaubt wäre) herauszufiltern. In meinem Bsp wird versucht einer Prozedur, welche 2 Parameter benötigt, nur eins zu übergeben.
pb 4.51
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Nein, das funktioniert ueberhaupt nicht. Zumindest nicht mit PB.
Antworten