Parameterübergabe an Prozeduren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Parameterübergabe an Prozeduren

Beitrag von ProgOldie »

Hallo,
ich habe offenbar momentan ein Brett vor dem Kopf, denn ich sitze an einem gerade lächerlichen Problem.

Code: Alles auswählen

Define x.i,y.s,z.i

Procedure test(a,b.s,c.i)
  a=15
  b="Teststring"
  c=19
EndProcedure

x=5
y="abc"
z=9
test(x,y,z)

Debug Str(x)+#LF$+y+#LF$+Str(z)
Wie erreiche ich es, dass bei Debug die Werte 15, "Teststring" und 19 ausgegeben werden?
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Parameterübergabe an Prozeduren

Beitrag von man-in-black »

Hi,

du musst in dem Fall mir Pointern auf x,y,z arbeiten:

Code: Alles auswählen

Procedure test(*a,*b,*c)
  *a=15
  *b="Teststring"     ;nat. pokes und so weiter ...
  *c=19
EndProcedure

test(@x,@y,@z)

MFG
MIB
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Parameterübergabe an Prozeduren

Beitrag von ProgOldie »

Code: Alles auswählen

Procedure test(*a,*b.s,*c.i)
  *a=15
  *b="Teststring"
  *c=19
EndProcedure

test(@x,@y,@z)
Das kann's aber nicht sein, das habe ich auch schon probiert.
Auf jeden Fall müssen im Prozeduraufruf die Typdeklarationen weg.

Code: Alles auswählen

Define x.i,y.s,z.i

Procedure test(*a,*b,*c)
  *a=15
  *b="Teststring"
  *c=19
EndProcedure

x=5
y="abc"
z=9
test(@x,@y,@z)

Debug Str(x)+#LF$+y+#LF$+Str(z)

Aber auch das hilft nichts, denn mit Strings geht das offenbar nicht so einfach.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Parameterübergabe an Prozeduren

Beitrag von man-in-black »

Hi,

ich war etwas schreibfaul. Du musst nat. poke statt = nutzen (habs eigentlich dazu geschrieben):

Code: Alles auswählen

Define x.i,y.s,z.i

Procedure test(*a,*b,*c)
  PokeI(*a,15)
  PokeS(*b,"Teststring")
  PokeI(*c,19)
EndProcedure

x=5
y="abc"
z=9
test(@x,@y,@z)

Debug Str(x)+#LF$+y+#LF$+Str(z)
MFG
MIB
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Parameterübergabe an Prozeduren

Beitrag von ProgOldie »

Sorry, aber auch das funktioniert zwar mit den Integers, nicht aber mit dem String, den es wird dafür so etwas ausgegeben wie
Teststri킝㾑
Auch mit dem Unicodeparameter in PokeS habe ich es schon ohne Erfolg probiert.

P.S.: Ich verwende PB 5.60

Edit: Es ist eigentlich kein Wunder, dass nur ein Teil des Strings korrekt zurückgegeben wird. Das liegt sicher an der unterschiedlichen Zeichenzahl je nachdem, ob ASCII oder UTF-8 oder Unicode. In der Hilfe steht, dass man in der Prozedur dann eine Kombination aus PeekS( Ermittlung der korrekten Zeichenzahl) und PokeS verwenden muss.
Zuletzt geändert von ProgOldie am 24.09.2017 20:20, insgesamt 1-mal geändert.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Demivec
Beiträge: 49
Registriert: 22.02.2008 20:49
Wohnort: Utah, USA

Re: Parameterübergabe an Prozeduren

Beitrag von Demivec »

Code: Alles auswählen

Define x.i, y.String, z.i

Procedure test(*a.Integer, *b.String, *c.Integer)
  *a\i = 15
  *b\s = "Teststring"
  *c\i = 19
EndProcedure

x = 5
y\s = "abc"
z = 9
test(@x, @y, @z)

Debug Str(x) + #LF$ + y\s + #LF$ + Str(z)
@Edit: gelöschte Zeile Protected *b2.String, es ist überflüssig.
Zuletzt geändert von Demivec am 26.09.2017 01:20, insgesamt 1-mal geändert.
Bild
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Parameterübergabe an Prozeduren

Beitrag von ProgOldie »

Danke Demivec, damit klappt's.

Edit: Protected *b2.String ist überflüssig.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Parameterübergabe an Prozeduren

Beitrag von man-in-black »

Hi,

kann ich so nicht bestätigen - PB5.60 x64.
Das wird auch nicht an Unicode vs ... liegen, da die "normalen" Zeichen geteilt werden.

Probiers einfach mal ohne die Debugausgabe:

Code: Alles auswählen

MessageRequester(y,y)
MFG
MIB
(hab alles, kann alles, weiß alles!!^^)

Bild
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

Re: Parameterübergabe an Prozeduren

Beitrag von ts-soft »

man-in-black hat geschrieben:

Code: Alles auswählen

MessageRequester(y,y)
y\s, y\s
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
NicTheQuick
Ein Admin
Beiträge: 8675
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: Parameterübergabe an Prozeduren

Beitrag von NicTheQuick »

Ich würde es ja gleich mit einer großen Struktur machen. Es sei denn, dass ist nicht so gedacht:

Code: Alles auswählen

Structure bar
	a.i
	b.s
	c.i
EndStructure

Procedure test(*foo.bar)
	With *foo
		\a = 15
		\b = "Teststring"
		\c = 19
	EndWith
EndProcedure

Define foo.bar
foo\a = 5
foo\b = "abc"
foo\c = 9
test(foo)

Debug "" + foo\a + #LF$ + foo\b + #LF$ + foo\c
Bild
Antworten