Struktur von Procedure zurückgeben?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Struktur von Procedure zurückgeben?

Beitrag 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!
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

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 »

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.
Benutzeravatar
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 »

Ausserdem kann man keine Strukturen zurückgeben, niemals :mrgreen:
Strukturierte Variablen oder deren Pointer schon eher.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag 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
Benutzeravatar
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 »

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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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 ...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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.
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
Benutzeravatar
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 »

> 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten