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
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Dinge, die ich nicht wusste

Beitrag von Josef Sniatecki »

Hallo,

in diesem Thread sollten alle Dinge über PureBasic aufgeschrieben werden,
die sehr interessant und nützlich sind.
(Ich hoffe so ein Thema gab es nicht vor ein paar Wochen)

Hier sind meine Tipps:

1. Größe einer Array
Es ist möglich die größe (Anzahl der Items)
einer Array folgendermaßen zu erhalten:

Code: Alles auswählen

Dim Array(10)
Debug PeekL(@Array(0)-SizeOf(Long)*2)
2. NewLists und Arrays in DLL's
Achtung: Arrays und LinkedLists sollten inerhalb
einer Prozedur definiert werden, wenn der Code in eine
DLL generiert werden soll.
Beispiel:

Code: Alles auswählen

ProcedureDLL.l Init()
  Global Dim Array(123)
  Global NewList List()
EndProcedure
3. DataSections besser auslesen (für Anfänger)
Daten aus "DataSections" können handlicher durch
Zeiger ausgelesen werden.
Beispiel:

Code: Alles auswählen

DataSection
  Person:
    Data.s "Josef"
    Data.l 15
EndDataSection
Debug PeekS(?Person)
Debug PeekL(?Person+Len(PeekS(?Person))+1)
Nun seid ihr dran...
Zuletzt geändert von Josef Sniatecki am 26.09.2008 22:14, insgesamt 1-mal geändert.
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ß
Little John

Re: Dinge, die ich nicht wusste

Beitrag von Little John »

Josef Sniatecki hat geschrieben:1. Größe einer Array
Es ist möglich die größe (Anzahl der Items)
einer Array folgendermaßen zu erhalten:

Code: Alles auswählen

Dim Array(10)
Debug PeekL(@Array(0)-SizeOf(Long))
Ich kenne dafür diesen Code

Code: Alles auswählen

PeekL(@array-8)
Vielleicht kommt das aufs gleiche raus ...
Aber das ist jetzt sowieso nicht mehr zu empfeheln, da es nie offiziell dokumentiert war, und da PB 4.30 jetzt eine eingebaute Funktion dafür hat.
Josef Sniatecki hat geschrieben:2. NewLists und Arrays in DLL's
Achtung: Arrays und LinkedLists sollten inerhalb
einer Prozedur definiert werden, wenn der Code in eine
DLL generiert werden soll.
Beispiel:

Code: Alles auswählen

ProcedureDLL.l Init()
  Global Dim Array(123)
  Global NewList List()
EndProcedure
PB 4.20 hat geschrieben:Die Deklaration von Arrays und LinkedLists mittels Dim bzw. NewList muss stets innerhalb der Prozedure AttachProcess erfolgen.
Gruß, Little John
Zuletzt geändert von Little John am 26.09.2008 17:21, insgesamt 1-mal geändert.
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag von Josef Sniatecki »

Upps. Da bin ich wohl nicht auf dem neuesten Stand. Nun habe ich was
aus meinen eigenen Thread gelernt. <)
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ß
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Josef Sniatecki hat geschrieben:

Code: Alles auswählen

Dim Array(10)
Debug PeekL(@Array(0)-SizeOf(Long))
..ergibt bei mir 5.

Sizeof(quad) würde schon besser funken, da 8!
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Code: Alles auswählen

Dim Array(10)
Debug PeekL(@Array(0)-SizeOf(Long)*2)
Das ergibt die korrekten 11.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Stimmt! ...so soll es auch sein :wink:
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

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 !!
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
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

So noch was was nicht jeder weis:

Wenn man in einer ForEach - Schleife mit DeleteElement() ein Element der Liste ,die abgearbeitet wird, löscht, sollte man sofort danach Continue ausführen, ansonsts kanns (muss nicht) bei der Liste später Fehler geben. Ich weis nicht ob sich das mit dem neuen LinkedList-Managemant in 4.3 ändert, bis 4.2 wars so.
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
Little John

Beitrag von Little John »

2cxAlex:
Das ist ja total wichtig!
Wenn das nicht in der Hilfe steht, vielleicht kannst Du's dann vielleicht auch nochmal hierhin posten?

Gruß, Little John
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

das man Continue benutzen "muss" steht nicht in der Hilfe, weil es ja kein "muss" ist.

Was bei DeleteElement()passiert steht ausführlich in der Hilfe drin...

genauso gut kann man einfach darauf achten das ein Delete immer am "Ende" der schleife steht, sodass es dann eh weiter geht ...
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
Antworten