Dinge, die ich nicht wusste

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag 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.
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag 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)
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

@STARGÅTE: danke für den Code! Gut zu wissen!

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Zuletzt geändert von DarkDragon am 27.09.2008 19:24, insgesamt 1-mal geändert.
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.
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

Beitrag von ts-soft »

> was du da machst ist VERBOTEN ! :lol:
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
Antworten