C Übersetzer-Frage :)

Für allgemeine Fragen zur Programmierung mit PureBasic.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

C Übersetzer-Frage :)

Beitrag 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?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: C Übersetzer-Frage :)

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: C Übersetzer-Frage :)

Beitrag von ccode_new »

Hi STARGÅTE!

Ja der "Prototype" Befehl von PureBasic könnte mich hierbei weiter bringen.

Aber hier muss ich Umwege gehen.

Code: Alles auswählen

p->p_Deactivator(p)
Deklariert ist das Ganze ja so:

Code: Alles auswählen

Bool (*p_Deactivator)(struct A *)
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))
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: C Übersetzer-Frage :)

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: C Übersetzer-Frage :)

Beitrag von ccode_new »

Hi mk-soft!

Das sieht gut aus, oder:
"Alles ist möglich, fragt sich nur wie..."

Danke!
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten