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 :mrgreen:
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 :wink:

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