Seite 1 von 1
C Übersetzer-Frage :)
Verfasst: 27.02.2023 21:51
von ccode_new
Hi Leute!
Wie kann ich so etwas:
Code: Alles auswählen
struct A {
int x
int y
bool ok
Bool (*p_Deactivator)(struct A *) ;Zeiger auf eine Funktion!!!
}
struct B {
Vector2 a
Vector2 b
bool ok
Bool (*p_Deactivator)(struct A *) ;Zeiger auf eine Funktion!!!
}
A * Object_New(Bool (*deactivatorFunc)(struct A *))
{
A *p = calloc(1, SizeOf(A));
//...
if(deactivatorFunc != NULL) {
p->p_Deactivator = deactivatorFunc
}
}
void Object_Update(A *p, float value)
{
//..
if(p->p_Deactivator(p)) { ; Wie kann ich das hier am besten in PureBasic umsetzen?
p->ok = false;
return
}
//..
}
am besten in PureBasic programmieren?
Beispiele?
Re: C Übersetzer-Frage :)
Verfasst: 27.02.2023 22:23
von STARGÅTE
Ich kenne mich mit C nicht aus kann dir aber Lösungsvorschläge zu deinen Kommentaren machen:
Zeiger auf Funktionen kannst du mit dem Schlüsselwort Prototype vordefinieren und mit dem @ zuweisen:
Code: Alles auswählen
Prototype.f Operation(X.f, Y.f)
Procedure.f Plus(X.f, Y.f)
ProcedureReturn X + Y
EndProcedure
Procedure.f Times(X.f, Y.f)
ProcedureReturn X * Y
EndProcedure
Define Op.Operation
Op = @Plus()
Debug Op(3.0, 4.0)
Op = @Times()
Debug Op(3.0, 4.0)
Das "Op.Operation" kann auch teil einer Struktur sein.
Auf Aufrufen einer Methode geht über Interface.
Ein Beispiel von mir findest du hier:
https://www.purebasic.fr/german/viewtop ... 01#p361101
Re: C Übersetzer-Frage :)
Verfasst: 27.02.2023 23:06
von ccode_new
Hi STARGÅTE!
Ja der "Prototype" Befehl von PureBasic könnte mich hierbei weiter bringen.
Aber hier muss ich Umwege gehen.
Deklariert ist das Ganze ja so:
Dies heißt:
Die übergebene Funktion muss einen Rückgabewert "bool" haben und einen Parameter mit einem Zeiger auf die Struktur "A".
Der Funktion "void Object_Update(A *p, float value)" wird ein Zeiger auf die Struktur "A" übergeben.
Damit kann man hiermit:
"p->p_Deactivator(p)" die Funktion direkt aufrufen.
Also könnte ich auch einfach die "Deactivator-Funktion" mit Übergabe der Struktur "A" als Parameter hier direkt aufrufen, oder?
Hier wird dies ja direkt über eine Struktur gemacht.
(p ist ja vom Typ A (In PureBasic muss man halt nur immer das * zum Namen mitschreiben))
Re: C Übersetzer-Frage :)
Verfasst: 27.02.2023 23:37
von mk-soft
Sollte so passen ...
Code: Alles auswählen
; struct A {
; int x
; int y
; bool ok
;
; Bool (*p_Deactivator)(struct A *) ;Zeiger auf eine Funktion!!!
; }
;
; struct B {
; Vector2 a
; Vector2 b
; bool ok
;
; Bool (*p_Deactivator)(struct A *) ;Zeiger auf eine Funktion!!!
; }
;
; A * Object_New(Bool (*deactivatorFunc)(struct A *))
; {
; A *p = calloc(1, SizeOf(A));
; //...
; if(deactivatorFunc != NULL) {
; p->p_Deactivator = deactivatorFunc
; }
; }
;
;
; void Object_Update(A *p, float value)
; {
; //..
; if(p->p_Deactivator(p)) { ; Wie kann ich das hier am besten in PureBasic umsetzen?
; p->ok = false;
; return
; }
; //..
; }
Prototype protoDeactivator(*a)
Structure structA
x.l
y.l
ok.l
*deactivator.protoDeactivator
EndStructure
Procedure object_new(*DeactivatorFunc)
Protected *p.structA
*p = AllocateStructure(structA)
If *p
*p\deactivator = *DeactivatorFunc
EndIf
ProcedureReturn *p
EndProcedure
Procedure object_update(*p.structA, value.f)
If *p And *p\deactivator
If *p\deactivator(*p)
*p\ok = #True
EndIf
EndIf
EndProcedure
; ----
Procedure Deactivator(*a.structA)
;
ProcedureReturn #True
EndProcedure
Global *A.structA
*A = object_new(@Deactivator())
object_update(*A, 100.0)
Debug *A\ok
Re: C Übersetzer-Frage :)
Verfasst: 27.02.2023 23:51
von ccode_new
Hi mk-soft!
Das sieht gut aus, oder:
"Alles ist möglich, fragt sich nur wie..."
Danke!