Seite 1 von 1
Was mache ich Falsch?Oder Bug!
Verfasst: 08.06.2006 01:38
von Nighthawk
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
Verfasst: 08.06.2006 01:54
von mk-soft
Strukture für Ergebnis übergeben.
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
FF

Verfasst: 08.06.2006 09:14
von DarkDragon
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.
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
So dürfte es funktionieren, tut es aber auch nicht. Warum ein "Invalid Memory Access" kommt verstehe ich hier nun wirklich nicht.
Verfasst: 08.06.2006 10:37
von real
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
Verfasst: 08.06.2006 10:55
von ts-soft
etwas simpler, wobei die stringlänge begrenzt ist:
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
hab nur das Define geändert auf FixString
Verfasst: 09.06.2006 02:10
von Nighthawk
Hallo,an alle!
Vielen Dank für die schnelle Hilfe.
Gruß
Nighthawk