Seite 2 von 3
Verfasst: 27.09.2008 13:20
von Kiffi
cxAlex hat geschrieben:ansonsts kanns (muss nicht) bei der Liste später Fehler geben.
kann ich so jetzt nicht nachvollziehen. Hast Du einen Testcode?
Mein Code:
Code: Alles auswählen
NewList Test()
For Counter = 1 To 10
AddElement(Test())
Test() = Counter
Next
ForEach Test()
If (Test() % 2) = 0
; Alle graden Zahlen (2, 4, 6, 8) löschen
DeleteElement(Test())
EndIf
Next
ForEach Test()
Debug Test()
Next
Grüße ... Kiffi
Verfasst: 27.09.2008 13:25
von STARGÅTE
es geht darum :
Code: Alles auswählen
NewList Test()
For Counter = 1 To 10
AddElement(Test())
Test() = Counter
Next
ForEach Test()
If (Test() % 2) = 0
; Alle graden Zahlen (2, 4, 6, 8) löschen
DeleteElement(Test())
EndIf
; und nun jede Zahl * -1
Test() = -Test()
Next
ForEach Test()
Debug Test()
Next
wie du siehst wird nun jede zahl 2 mal mit -1 multipliziert.
da nach dem DeleteElement wieder das vorgängerelement dran ist.
Deswegen Continue nach Delete oder die rechung am anfang
Verfasst: 27.09.2008 13:44
von Josef Sniatecki
STARGÅTE hat geschrieben:ich frage mich gerade wieso das heir "Für Anfänger" leichter sein soll:
Code: Alles auswählen
DataSection
Person:
Data.s "Josef"
Data.l 15
EndDataSection
Debug PeekS(?Person)
Debug PeekL(?Person+Len(PeekS(?Person))+1)
zumal in der Hilfe noch steht:
Peek/Poke sind für fortgeschrittene Programmierer
Da finde ich das (persönlich) einfacher zu verstehen:
Code: Alles auswählen
DataSection
Person:
Data.s "Josef"
Data.l 15
EndDataSection
Restore Person
Read Name.s
Read Alter.l
Debug Name
Debug Alter
; PB 4.20 !!
Ich meine damit, dass fortgeschrittene Leute diese Methode schon kennen, Anfänger jedoch nicht.
Verfasst: 27.09.2008 14:26
von kswb73
Mehrer Werte in einem Parameter (wie zum Beispiel bei openWindow)
Code: Alles auswählen
#A=%1000
#B=%0100
#C=%0010
#D=%0001
Procedure.s multiPara(para)
text.s
If #A&Para
text+"A "
EndIf
If #B&Para
text+"B "
EndIf
If #C&Para
text+"C "
EndIf
If #D&Para
text+"D "
EndIf
ProcedureReturn text
EndProcedure
Debug multiPara(#A|#B)
Debug MultiPara(#C|#A)
Debug MultiPara(#A|#B|#C|#D)
Verfasst: 27.09.2008 16:57
von Kaeru Gaman
Rückgabe von mehreren Werten aus einer Procedur mittels Struktur als Container.
maximale Rückgabemenge 1Quad = 8byte
Code: Alles auswählen
Structure Combi
X.w
Y.w
Z.w
T.w
EndStructure
Structure Container
StructureUnion
C.Combi
Q.q
EndStructureUnion
EndStructure
Procedure.q ReturnFour( InX.w, InY.w, InZ.w, InT.w )
Protected Returner.Container
Returner\C\X = InX * 2
Returner\C\Y = InY * 2
Returner\C\Z = InZ * 2
Returner\C\T = InT * 2
ProcedureReturn Returner\Q
EndProcedure
Define FourInOne.Container
FourInOne\Q = ReturnFour( 3, 4, 5, 6 )
Debug "Return X = "+Str(FourInOne\C\X)
Debug "Return Y = "+Str(FourInOne\C\Y)
Debug "Return Z = "+Str(FourInOne\C\Z)
Debug "Return T = "+Str(FourInOne\C\T)
Verfasst: 27.09.2008 17:50
von Kiffi
@STARGÅTE: danke für den Code! Gut zu wissen!
Grüße ... Kiffi
Verfasst: 27.09.2008 19:00
von cxAlex
So kann man mehrere Werte zurückgeben
unabhängig von der Größe der Struktur unter Verwendung von Pointern.
Code: Alles auswählen
Structure MyStruct
Val1.l
Val2.l
Val3.d
Val4.d
EndStructure
Macro ReturnStruct(_Var, _Struct)
*tMem = AllocateMemory(SizeOf(_Struct))
CopyMemory(@_Var, *tMem, SizeOf(_Struct))
ProcedureReturn *tMem
EndMacro
Procedure Return4Values()
tVar.MyStruct
tVar\Val1 = 1233
tVar\Val2 = 124124
tVar\Val3 = 1212.213123
tVar\Val4 = 1233.123321
ReturnStruct(tVar, MyStruct)
EndProcedure
*Test.MyStruct = Return4Values()
Debug *Test\Val1
Debug *Test\Val2
Debug *Test\Val3
Debug *Test\Val4
Verfasst: 27.09.2008 19:19
von STARGÅTE
was du da machst ist
VERBOTEN !
denn du gibst den erstellten Speicher nicht wieder frei !
Wenn du diese Procedure in einer Schleife aufrufst,
ist das das Ende deines RAMs !
(und das schon nach wenigen Minuten)
Besser wäre es den RückgabePointer, gleich mit als Parameter zu übergeben, und das ProcedureReturn nur als True/False zu benutzen ob der angegebene Pointer gefüllt wurde oder nicht.
Verfasst: 27.09.2008 19:23
von DarkDragon
STARGÅTE hat geschrieben:was du da machst ist
VERBOTEN !
denn du gibst den erstellten Speicher nicht wieder frei !
Wenn du diese Procedure in einer Schleife aufrufst,
ist das das Ende deines RAMs !
(und das schon nach wenigen Minuten)
PureBasic Hilfe hat geschrieben:Hinweis: Alle reservierten Speicherbereiche werden automatisch freigegeben, wenn das Programm beendet wird.
Er hätte ja genauso gut am Ende FreeMemory(*Test) schreiben können, aber zu Testzwecken tuts das und es wird sowieso wieder freigegeben.
Was mir nur nicht klar wird ist warum er nicht einfach von Anfang an Pointer nimmt, denn das macht auch nichts komplizierter.
Verfasst: 27.09.2008 19:24
von ts-soft
> was du da machst ist VERBOTEN !
