Seite 1 von 2
Struktur von Procedure zurückgeben?
Verfasst: 20.05.2009 17:50
von PureBasic4.0
Hallo,
ich möchte von einer Procedure mehrere Werte zurückgeben. Hierzu habe ich versucht, die Daten in der Procedure in eine Struktur zu packen und diese dann zurückzugeben. Leider will das noch nicht klappen.
Mein bisheriger Code:
Code: Alles auswählen
Structure Namen
name.s
vorname.s
EndStructure
Procedure verarbeite(vorname$,name$)
Define Namensliste.Namen
Namensliste\name = name$
Namensliste\vorname = vorname$
ProcedureReturn Namensliste
EndProcedure
verarbeite("Max","Mustermann")
Wie kann ich im Hauptprogramm die Daten wieder auslesen?
Danke für die Antworten!
Verfasst: 20.05.2009 17:52
von cxAlex
So sollte das gehen:
Code: Alles auswählen
Structure Namen
name.s
vorname.s
EndStructure
Procedure verarbeite(vorname$, name$, *Namen.Namen)
With *Namen
\name = name$
\vorname = vorname$
EndWith
EndProcedure
Define Namen.Namen
verarbeite("Max", "Mustermann", @Namen)
Debug Namen\Name
Debug Namen\Vorname
Verfasst: 20.05.2009 18:00
von PureBasic4.0
Vielen Dank, auf die Idee bin ich gar nicht gekommen, die Struktur quasi als Pointer zu übergeben.
Verfasst: 20.05.2009 19:20
von Kaeru Gaman
quasi ja, konkret den pointer auf eine vorher erzeugte struktur übergeben.
alles, was du mehr als einen einfachen wert zurückgeben willst, musst du so behandeln.
auch einen string kann man nur deshalb zurückgeben,
weil die Proc im endeffekt nur einen pointer zu dem string zurückgibt.
Verfasst: 20.05.2009 19:58
von ts-soft
Ausserdem kann man keine Strukturen zurückgeben, niemals
Strukturierte Variablen oder deren Pointer schon eher.
Verfasst: 22.05.2009 08:58
von Shardik
PureBasic4.0 hat geschrieben:Vielen Dank, auf die Idee bin ich gar nicht gekommen, die Struktur quasi als Pointer zu übergeben.
Eine weitere Möglichkeit wäre die Definition der Variablen mit der gewünschten Struktur in der Prozedur mit Shared:
Code: Alles auswählen
Structure Namen
name.s
vorname.s
EndStructure
Procedure verarbeite(vorname$,name$)
Shared Namensliste.Namen
Namensliste\name = name$
Namensliste\vorname = vorname$
EndProcedure
Define Namensliste.Namen
verarbeite("Max","Mustermann")
Debug Namensliste\name
Debug Namensliste\vorname
Verfasst: 22.05.2009 09:32
von ts-soft
Define aber besser vor der Nutzung als Shared:
Code: Alles auswählen
EnableExplicit
Structure Namen
name.s
vorname.s
EndStructure
Define Namensliste.Namen
Procedure verarbeite(vorname$,name$)
Shared Namensliste.Namen
Namensliste\name = name$
Namensliste\vorname = vorname$
EndProcedure
verarbeite("Max","Mustermann")
Debug Namensliste\name
Debug Namensliste\vorname
Dann klappts auch mit EnableExplicit

Verfasst: 22.05.2009 12:45
von Kaeru Gaman
@Shardik
die deklaration einer Variablen mit Shared innerhalb einer Procedure ist nur dann möglich, wenn sie bereits zuvor im Hauptcode deklariert wurde!
... siehe code von ts ...
Verfasst: 22.05.2009 13:24
von hjbremer
uuups !
Code: Alles auswählen
Procedure test1()
Shared a
a=10
EndProcedure
Procedure test2()
Shared a
a+11
EndProcedure
Procedure test3()
Shared a
a=a*10
Debug a
EndProcedure
test1()
test2()
test3()
die Variable a wurde nirgends im Hauptprogramm deklariert.
Verfasst: 22.05.2009 13:37
von ts-soft
> die Variable a wurde nirgends im Hauptprogramm deklariert.
Die wurde on the fly deklariert. Steht ja auch so in der Hilfe.
Allerdings sollte man es so nicht machen, bei so kurzen sinnlosen Code
mags ja noch gehen, wenn man aber erstmal 3 - 10 Includes hat, die man
bereits vor Monaten erstellt hat, wirds dann in die Hose gehen, ohne
EnableExplicit