Für allgemeine Fragen zur Programmierung mit PureBasic.
PureBasic4.0
Beiträge: 785 Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1
Beitrag
von PureBasic4.0 » 20.05.2009 17:50
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!
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
cxAlex
Beiträge: 2111 Registriert: 26.06.2008 10:42
Beitrag
von cxAlex » 20.05.2009 17:52
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
PureBasic4.0
Beiträge: 785 Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1
Beitrag
von PureBasic4.0 » 20.05.2009 18:00
Vielen Dank, auf die Idee bin ich gar nicht gekommen, die Struktur quasi als Pointer zu übergeben.
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Kaeru Gaman
Beiträge: 17389 Registriert: 10.11.2004 03:22
Beitrag
von Kaeru Gaman » 20.05.2009 19:20
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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
ts-soft
Beiträge: 22292 Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43 CPU: AMD FX-6300 Six-Core Processor GraKa: GeForce GTX 750 Ti, 2 GB Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin
Beitrag
von ts-soft » 20.05.2009 19:58
Ausserdem kann man keine Strukturen zurückgeben, niemals
Strukturierte Variablen oder deren Pointer schon eher.
Shardik
Beiträge: 746 Registriert: 25.01.2005 12:19
Beitrag
von Shardik » 22.05.2009 08:58
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
ts-soft
Beiträge: 22292 Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43 CPU: AMD FX-6300 Six-Core Processor GraKa: GeForce GTX 750 Ti, 2 GB Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin
Beitrag
von ts-soft » 22.05.2009 09:32
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
Kaeru Gaman
Beiträge: 17389 Registriert: 10.11.2004 03:22
Beitrag
von Kaeru Gaman » 22.05.2009 12:45
@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 ...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
hjbremer
Beiträge: 822 Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster
Beitrag
von hjbremer » 22.05.2009 13:24
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.
Purebasic 5.70 x86 5.72 X 64 - Windows 10
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
ts-soft
Beiträge: 22292 Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43 CPU: AMD FX-6300 Six-Core Processor GraKa: GeForce GTX 750 Ti, 2 GB Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin
Beitrag
von ts-soft » 22.05.2009 13:37
> 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