Seite 1 von 1

Prototype - Parameterproblem

Verfasst: 04.09.2009 11:22
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?

Re: Prototype - Parameterproblem

Verfasst: 04.09.2009 17:10
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.

Verfasst: 04.09.2009 17:33
von gnasen
gibt es denn eine Möglichkeit sowas zu realisieren?

Verfasst: 04.09.2009 19:51
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.

Verfasst: 06.09.2009 16:19
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.

Verfasst: 06.09.2009 17:03
von edel
Nein, das funktioniert ueberhaupt nicht. Zumindest nicht mit PB.