Variable von Prozedur zu Prozedur weitergeben

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Jac de Lad
Beiträge: 56
Registriert: 24.07.2019 17:53
Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
Wohnort: Riesa
Kontaktdaten:

Variable von Prozedur zu Prozedur weitergeben

Beitrag von Jac de Lad »

Hallo,
ich mal wieder. Ich möchte eine Variable von einer Prozedur zu einer anderen weitergeben, ohne, dass sie als Global definiert wird. Geht das? Ich kenne es von XProfan so:

Code: Alles auswählen

proc zwei
print local$
endproc

proc eins
declare local$
local$="Test"
zwei
endproc

cls
eins
waitinput
Ihr versteht bestimmt, was ich meine: die Variable wird in "eins" definiert und ist in "zwei" automatisch auch definiert und behält ihren Inhalt. Im Hauptteil des Programms ist sie aber nicht verfügbar (ich könnte sie auch oberhalb der ersten proc "declare"-n, aber das will ich nicht.

Mir reicht bestimmt ein Hinweis auf das richtige Schlüsselwort.
Vielen Dank im Voraus.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Variable von Prozedur zu Prozedur weitergeben

Beitrag von NicTheQuick »

Nein, das geht so nicht. Es gibt keine Deklaration für Variablen, die diese ausschließlich in Procedures zur Verfügung stellt.
Es gibt zwar Shared, aber das nimmt sich auch nur eine Variable aus dem globalen Scope.
Mit Protected wird eine Variable ausschließlich in einer Procedure deklariert, aber ist nicht in der nächsten darin aufgerufenen Procedure verfügbar.

Was würde eigentlich in dem XProfan-Beispiel passieren, wenn man "zwei" im Hauptprogramm aufruft? Dann gibt es "local$" ja nirgendwo. Kommt dann ein Fehler beim "print"?

Dann noch eine Gegenfrage: Warum möchtest du die Variable nicht als Parameter übergeben?
Bild
Benutzeravatar
Jac de Lad
Beiträge: 56
Registriert: 24.07.2019 17:53
Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
Wohnort: Riesa
Kontaktdaten:

Re: Variable von Prozedur zu Prozedur weitergeben

Beitrag von Jac de Lad »

In dem Fall würde eine Fehlermeldung kommen. Wenn ich "local$" global definiere hätte sie den Inhalt der globalen Variable; bei Aufruf durch "eins" wieder den den von "eins" (lokal überschreibt global).

Ich hab einen Teil in einer Procedure, der immer wieder ausgeführt wird, Schleife geht aber nicht, weil es an verschiedenen Stellen ist. ich wollte den Teil in eine eigene Procedure auslagern. Ich kann zwar dir ganzen Variablen übergeben, aber das sind enorm viele. Kann ich es als Bautstein definieren oder so? Auch verstehe ich den Sinn von Share noch nicht.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Variable von Prozedur zu Prozedur weitergeben

Beitrag von NicTheQuick »

Wenn es enorm viele Variablen sind, könntest du auch eine Struktur benutzen. Dann wird es allerdings ein klein wenig komplizierter, da du dann mit Pointern arbeiten musst.
Hier ein Beispiel

Code: Alles auswählen

EnableExplicit

Structure Vars
	enorm.i
	viele.i
	variablen.i
	;...
EndStructure

Procedure zwei(*vars.Vars)
	Debug *vars\enorm
	Debug *vars\viele
	Debug *vars\variablen
EndProcedure

Procedure eins()
	Protected vars.Vars
	
	vars\enorm = 1
	vars\viele = 2
	vars\variablen = 3
	
	zwei(vars)
EndProcedure

eins()
Und hier noch ein Beispiel mit Shared. Ich hoffe der Code ist Dokumentation genug:

Code: Alles auswählen

EnableExplicit

; Diese Variable is überall verfügbar
Global globalVariable.s = "Global"

; Diese Variable ist nur im Hauptprogramm verfügbar
Define mainVariable.s = "Define"


Procedure proc1()
	Debug globalVariable
	
	;Das geht nicht
	;Debug mainVariable
EndProcedure

Procedure proc2()
	Debug globalVariable
	
	;Aber wir können die Variable aus dem Hauptprogramm mit Shared hier rein holen
	Shared mainVariable
	Debug mainVariable
EndProcedure

proc1()
proc2()
Noch ein Hinweis. Mit "EnableExplicit" kannst du dem Compiler sagen, dass er dich darauf hinweist, wenn du eine Variable nicht deklariert hast. Damit lassen sich leicht Tippfehler bei Variablen finden oder generelle Probleme, wo du vergessen hast einer Variablen einen Typ zu geben oder ähnliches.
Bild
Benutzeravatar
Jac de Lad
Beiträge: 56
Registriert: 24.07.2019 17:53
Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
Wohnort: Riesa
Kontaktdaten:

Re: Variable von Prozedur zu Prozedur weitergeben

Beitrag von Jac de Lad »

Aber warum dann nicht gleich global, sondern shared?
EnableExplicit hab ich an, sonst würde bei mir gar nichts laufen. :lol: Struktur hab ich auch schon überlegt.

Nachtrag: Ich hab's in eine Struktur gelegt. Die lässt sich auch am einfachsten löschen, wenn die Hauptfunktion wieder aufgerufen wird. Nochmal danke für die Hilfe, daran, dass in Prozeduren definierte Variablen auch wirklich nur dort gelten muss ich mich noch gewöhnen. Aber das geht schon. Weitere dämliche Fragen folgen bald...

PS: Kann ich mit Shared in der Unter-Prozedur eine Variable aus einer Prozedur ranholen oder geht das nur, wenn sie im Hauptprogramm definiert ist?

Code: Alles auswählen

Procedure zwei()
  Shared dingeling
EndProcedure

Procedure eins()
  Define dingeling
  zwei()
EndProcedure


Ich seh grad...geht nicht. Doof.
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Variable von Prozedur zu Prozedur weitergeben

Beitrag von helpy »

jacdelad hat geschrieben:... Ich seh grad...geht nicht. Doof.
Warum willst Du das überhaupt tun?

Schreibe Prozeduren grundsätzlich so, dass diese universell eingesetzt werden können, ohne von anderen Variablen außerhalb abhängig zu sein. Es gibt nur die Prozedur-Argumente als "Eingabe" in die Prozedur und den Rückgabewert ("Ausgabe" der Prozedur). Es ist aber auch möglich eine Adresse an die Prozedur zu übergeben, wo diese das Ergebnis hinschreiben soll. Datenaustausch mit einer Prozedur ist also auf verschiedene Arten möglich.

Beachte auch:
Variablen, die mit Protected innerhalb einer Prozedur definiert wurden, sind nach Beendigung der Prozedur wieder ungültig! Von keiner Seite kann man von außerhalb auf Protected-Variablen zugreifen.

Wenn ich doch globale Anwendungsvariablen für spezifische Anwendungsroutinen brauche, dann lege ich mir im globalen Scope eine strukturierte Variable an. Beispiel:

Code: Alles auswählen

Structure tGlobal
	Init.i
	State.i
	Name.s
	...
EndStructure
Global g.tGlobal

Procedure ProcA()
	If Not g\Init
		; Init noch nich durchgeführt
	EndIf
	
	...
EndProcedure
Wenn ich überhaupt Global verwende, dann EIN EINZIGES mal für solch eine strukturierte globale Variable, alles andere wäre mir zu unübersichtlich. So weiß ich immer, dass "g\VarName" eine globale Variable ist.

Mit der Auto-Vervollständigen Funktion kann ich nach eingabe von "g\" sofort aus allen verfügbaren globalen Variablen auswählen. So verliere ich nicht den Überblick über globalen Variablen und kann in einer Prozedur leicht zwischen globalen und prozeduralen Varialben unterscheiden!
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Variable von Prozedur zu Prozedur weitergeben

Beitrag von helpy »

jacdelad hat geschrieben:Aber warum dann nicht gleich global, sondern shared?
Wenn Du grundsätzlich "Global" verwendest, dann sind diese Variablen in allen Prozeduren verfügbar und wenn in einer Prozedur mit "Protected" eine Variable mit dem gleichen Namen deklariert wird, dann gilt die "lokale" Variable und die globale ist dann nicht mehr verfügbar.
Wenn Du "Define/Shared" verwendest, dann musst Du bewusst in jeder Prozedur überlegen, welche globalen Variablen will ich hier verwenden.

Ich persönlich nutze Shared NIE ... ich wüsste nicht wie ich das bei meinem Programmierstil sinnvoll einsetzen könnte. Global verwende ich maximal ein einziges mal im globalen Scope (siehe oben).

... aber ... jedem das seine.
Es gibt mit PureBasic so viele Möglichkeiten etwas umzusetzen.
Ich beschränke mich in manchen Dingen (sie z.B. den Einsatz von Global/Shared) ganz bewusst um mir eine gewisse Übersichtlichkeit zu bewahren.
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
Jac de Lad
Beiträge: 56
Registriert: 24.07.2019 17:53
Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
Wohnort: Riesa
Kontaktdaten:

Re: Variable von Prozedur zu Prozedur weitergeben

Beitrag von Jac de Lad »

Ah verstehe. Nun in meinem Fall ging es speziell darum, dass ich 57 Zeilen an genau 3 Stellen (später vielleicht noch mehr) in genau dieser Prozedur brauche. Jetzt könnte ich jeweils an der Stelle den Code einfügen, das ist ineffizient und wenn was geändert werden muss sogar noch ineffizienter. Ich könnte an allen 3 Stellen eine Includedatei einfügen, das ist aber meines Erachtens auch ineffizient. Von Profan bin ich es gewohnt eine neue Proc zu schreiben und habe sofort Zugriff auf die Variablen der übergeordneten Proc. Das erscheint mir logisch, weil ich es so gewohnt bin. es gibt natürlich immer noch andere Wege das zu lösen, ich hab ja einen gefunden. Ich denke auch, dass es bei 5 verschiedenen Lösungen 5 Meinungen gibt, die alle irgendwo ihre Berechtigung haben.

Nochmal danke an alle Helfer und die vielen Hinweise.
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Variable von Prozedur zu Prozedur weitergeben

Beitrag von helpy »

Hast Du schon Makros probiert?
Wenn Du an X Stellen immer denselben Code haben möchtest...
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
Jac de Lad
Beiträge: 56
Registriert: 24.07.2019 17:53
Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
Wohnort: Riesa
Kontaktdaten:

Re: Variable von Prozedur zu Prozedur weitergeben

Beitrag von Jac de Lad »

Ah nein, aber das ist es was ich mit Baustein meinte. Nützlich, aber so wird mein Code dreimal geschrieben. Ich bleibe jetzt lieber bei der Prozedur. Klappt gut.
Antworten