Hallo,
ich brauche mehrere Rückgabewerte aus einer Funktion,beim probieren
bin ich über folgendes gestolpert
EnableExplicit
Define mytest.s=""
Procedure TestString(*test.s)
*test="Teststring"
EndProcedure
;Erster Aufruf der Funktion ergibt nur Müll
TestString(@mytest)
Debug mytest
;Zweiter Aufruf ist korekt
TestString(@mytest)
Debug mytest
Hab ich nun was übersehen oder geht sowas nicht mit PB?
Gruß
Nighthawk
Was mache ich Falsch?Oder Bug!
Strukture für Ergebnis übergeben.
FF 
Code: Alles auswählen
Structure udtResult
value1.l
value2.l
value3.l
EndStructure
Procedure test(value.l, *Result.udtResult)
With *Result
\value1 = value * 10
\value2 = value * 20
\value3 = value * 30
EndWith
EndProcedure
Result.udtresult
test(5, Result)
Debug Result\value1
Debug Result\value2
Debug Result\value3

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Also der String ist ja erstmal leer, d.h. länge 1 im Speicher. Desshalb musst du ihn erstmal durch Space(gewünschteMaximallänge) initialisieren.
So dürfte es funktionieren, tut es aber auch nicht. Warum ein "Invalid Memory Access" kommt verstehe ich hier nun wirklich nicht.
Code: Alles auswählen
EnableExplicit
Define mytest.s=Space(1024)
Procedure TestString(*test.STRING)
*test\s="Teststring"
EndProcedure
;Erster Aufruf der Funktion ergibt nur Müll
TestString(@mytest)
Debug mytest
;Zweiter Aufruf ist korekt
TestString(@mytest)
Debug mytest
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Bei Pointern und Speicherzugriffen würde ich immer mit den entsprechenden Poke-Befehlen arbeiten. Das sichert in diesem Fall ab, dass der richtige String an die richtige Speicheradresse geschrieben wird und das Ende des dort abgelegten Strings sauber nullterminiert wird.
Code: Alles auswählen
EnableExplicit
Define mytest.s=""
Procedure TestString(*test)
PokeS(*test,"Teststring")
EndProcedure
;Erster Aufruf der Funktion ergibt nur Müll
TestString(@mytest)
Debug mytest
;Zweiter Aufruf ist korekt
TestString(@mytest)
Debug mytest
- 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
etwas simpler, wobei die stringlänge begrenzt ist:
hab nur das Define geändert auf FixString
Code: Alles auswählen
EnableExplicit
Define mytest.s{100}
Procedure TestString(*test.s)
*test="Teststring"
EndProcedure
;Erster Aufruf der Funktion ergibt nur Müll
TestString(@mytest)
Debug mytest
;Zweiter Aufruf ist korekt
TestString(@mytest)
Debug mytest
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
