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,

Code: Alles auswählen

Repeat
*Test.MyStruct = Return4Values() 
ForEver
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,

Code: Alles auswählen

Repeat
*Test.MyStruct = Return4Values() 
ForEver
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 ! :lol: