Seite 1 von 1

Procedure als Funktion, die eine Structure zurück gibt

Verfasst: 30.04.2012 20:15
von Lothar Schirm
In FreeBASIC und anderen BASIC-Dialekten kann eine FUNCTION auch einen benutzerdefinerten Typ zurück geben. Beispiel:

TYPE Vektor
x AS DOUBLE
y AS DOUBLE
END TYPE

FUNCTION VektorAdd(a AS Vektor, b AS Vektor) AS Vektor
(Code zum addieren zweier Vektoren ...)
END FUNCTION

Wenn ich so etwas mit PureBasic versuche, bekomme ich eine Fehlermeldung, dass ProcedureReturn mit Structures nicht funktioniert. Beispiel:

Code: Alles auswählen


Structure Vektor
  x.d
  y.d
EndStructure

Procedure.Vektor VektorAdd(*a.Vektor, *b.Vektor)
  Protected c.Vektor
  c\x = *a\x + *b\x
  c\y = *a\y + *b\y
  ProcedureReturn c
EndProcedure

Geht das nur so, also nicht als Funktion?

Code: Alles auswählen


Procedure Vektoradd(*a.Vektor, *b.Vektor, c*Vektor)
  *c\x = *a\x + *b\x
  *c\y = *a\y + *b\y
EndProcedure


Re: Procedure als Funktion, die eine Structure zurück gibt

Verfasst: 30.04.2012 20:29
von ts-soft

Code: Alles auswählen

Structure Vektor
  x.d
  y.d
EndStructure

Procedure.i VektorAdd(*a.Vektor, *b.Vektor)
  Static c.Vektor ; damit die Speicheradresse auch nach dem Verlassen der Procedure gültig bleibt!
  c\x = *a\x + *b\x
  c\y = *a\y + *b\y
  ProcedureReturn @c
EndProcedure

Define *d.Vektor
Define.Vektor a, b

a\x = 10.0
a\y = 20.1
b\x = #PI
b\y = 0.815

*d = VektorAdd(@a, @b)
Debug *d\x
Debug *d\y

Geht alles, ist aber nicht immer alles sinnvoll :wink:

Re: Procedure als Funktion, die eine Structure zurück gibt

Verfasst: 01.05.2012 12:44
von Lothar Schirm
:) Vielen Dank! Werde mich mal mit dem Pointer-Tutorial beschäftigen (siehe Antwort auf meine andere Frage von gestern bezüglich der Rückgabe mehrerer Werte durch eine Prozedur).

Re: Procedure als Funktion, die eine Structure zurück gibt

Verfasst: 12.05.2012 13:33
von Josef Sniatecki
ts-soft hat geschrieben:Geht alles, ist aber nicht immer alles sinnvoll :wink:

Code: Alles auswählen

Structure Vektor
  x.d
  y.d
EndStructure

Procedure.i VektorAdd(*a.Vektor, *b.Vektor)
  Static c.Vektor ; damit die Speicheradresse auch nach dem Verlassen der Procedure gültig bleibt!
  c\x = *a\x + *b\x
  c\y = *a\y + *b\y
  ProcedureReturn @c
EndProcedure

Define *d.Vektor
Define a.Vektor, b.Vektor, c.Vektor

a\x = 0   : a\y = 0
b\x = 1   : b\y = 1
c\x = #PI : c\y = #PI

*d = VektorAdd(VektorAdd(@a, @b), VektorAdd(@b, @c))
Debug *d\x
Debug *d\y
In der Tat :mrgreen:

:wink: